all repos — postern

@ 70b0cd719774b75e29d0d40afa1435789c220c97

Modern mail management

clone
git clone https:///postern.git

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}