internal/policy/message.go (view raw)
1package policy
2
3import (
4 "errors"
5 "net/mail"
6
7 "go.starlark.net/starlark"
8)
9
10type MessageContext struct {
11 HeaderFrom Address
12 HeaderTo Address
13 Subject string
14 Headers mail.Header
15 Size int64
16}
17
18func (m MessageContext) String() string { return "<MessageContext>" }
19func (m MessageContext) Type() string { return "MessageContext" }
20func (m MessageContext) Freeze() {
21 m.HeaderFrom.Freeze()
22 m.HeaderTo.Freeze()
23}
24func (m MessageContext) Truth() starlark.Bool { return true }
25func (m MessageContext) Hash() (uint32, error) {
26 return 0, errors.New("unhashable")
27}
28
29func (m MessageContext) Attr(name string) (starlark.Value, error) {
30 switch name {
31 case "header_from":
32 return m.HeaderFrom, nil
33 case "header_to":
34 return m.HeaderTo, nil
35 case "subject":
36 return starlark.String(m.Subject), nil
37 case "size":
38 return starlark.MakeInt64(m.Size), nil
39 }
40 return nil, nil
41}
42
43func (m MessageContext) AttrNames() []string {
44 return []string{"header_from", "header_to", "subject", "size"}
45}
46
47// MessageContextFromEnvelope builds a policy.MessageContext from the envelope
48// fields of a stored message. The header_from address is parsed into an
49// Address; if parsing fails the raw string is preserved.
50func MessageContextFromEnvelope(from, subject string, size int64) MessageContext {
51 fromAddr, err := ParseAddress(from)
52 if err != nil || from == "" {
53 fromAddr = Address{Raw: from, Address: from}
54 }
55 return MessageContext{
56 HeaderFrom: fromAddr,
57 Subject: subject,
58 Size: size,
59 }
60}