package policy import ( "errors" "net/mail" "go.starlark.net/starlark" ) type Address struct { Address, Name, Raw string } func (a Address) String() string { return a.Raw } func (a Address) Type() string { return "Address" } func (a Address) Freeze() {} func (a Address) Truth() starlark.Bool { return true } func (a Address) Hash() (uint32, error) { return 0, errors.New("unhashable") } func (a Address) Attr(name string) (starlark.Value, error) { switch name { case "address": return starlark.String(a.Address), nil case "name": return starlark.String(a.Name), nil case "raw": return starlark.String(a.Raw), nil } return nil, nil } func (a Address) AttrNames() []string { return []string{"address", "name", "raw"} } func ParseAddress(email string) (Address, error) { a, err := mail.ParseAddress(email) if err != nil { return Address{}, err } addr := Address{ Raw: email, Address: a.Address, Name: a.Name, } return addr, nil }