internal/policy/address.go (view raw)
1package policy
2
3import (
4 "errors"
5 "net/mail"
6
7 "go.starlark.net/starlark"
8)
9
10type Address struct {
11 Address, Name, Raw string
12}
13
14func (a Address) String() string { return a.Raw }
15func (a Address) Type() string { return "Address" }
16func (a Address) Freeze() {}
17func (a Address) Truth() starlark.Bool { return true }
18func (a Address) Hash() (uint32, error) {
19 return 0, errors.New("unhashable")
20}
21
22func (a Address) Attr(name string) (starlark.Value, error) {
23 switch name {
24 case "address":
25 return starlark.String(a.Address), nil
26 case "name":
27 return starlark.String(a.Name), nil
28 case "raw":
29 return starlark.String(a.Raw), nil
30 }
31 return nil, nil
32}
33
34func (a Address) AttrNames() []string {
35 return []string{"address", "name", "raw"}
36}
37
38func ParseAddress(email string) (Address, error) {
39 a, err := mail.ParseAddress(email)
40 if err != nil {
41 return Address{}, err
42 }
43
44 addr := Address{
45 Raw: email,
46 Address: a.Address,
47 Name: a.Name,
48 }
49
50 return addr, nil
51}