package policy import ( "errors" "net/mail" "go.starlark.net/starlark" ) type MessageContext struct { HeaderFrom Address HeaderTo Address Subject string Headers mail.Header Size int64 } func (m MessageContext) String() string { return "" } func (m MessageContext) Type() string { return "MessageContext" } func (m MessageContext) Freeze() { m.HeaderFrom.Freeze() m.HeaderTo.Freeze() } func (m MessageContext) Truth() starlark.Bool { return true } func (m MessageContext) Hash() (uint32, error) { return 0, errors.New("unhashable") } func (m MessageContext) Attr(name string) (starlark.Value, error) { switch name { case "header_from": return m.HeaderFrom, nil case "header_to": return m.HeaderTo, nil case "subject": return starlark.String(m.Subject), nil case "size": return starlark.MakeInt64(m.Size), nil } return nil, nil } func (m MessageContext) AttrNames() []string { return []string{"header_from", "header_to", "subject", "size"} } // MessageContextFromEnvelope builds a policy.MessageContext from the envelope // fields of a stored message. The header_from address is parsed into an // Address; if parsing fails the raw string is preserved. func MessageContextFromEnvelope(from, subject string, size int64) MessageContext { fromAddr, err := ParseAddress(from) if err != nil || from == "" { fromAddr = Address{Raw: from, Address: from} } return MessageContext{ HeaderFrom: fromAddr, Subject: subject, Size: size, } }