...
1
2
3
4
5 package po
6
7 import (
8 "bytes"
9 "fmt"
10 "io"
11 "io/ioutil"
12 "sort"
13 )
14
15
16
17
18 type File struct {
19 MimeHeader Header
20 Messages []Message
21 }
22
23
24 func Load(data []byte) (*File, error) {
25 return loadData(data)
26 }
27
28
29 func LoadFile(path string) (*File, error) {
30 data, err := ioutil.ReadFile(path)
31 if err != nil {
32 return nil, err
33 }
34 return loadData(data)
35 }
36
37 func loadData(data []byte) (*File, error) {
38 r := newLineReader(string(data))
39 var file File
40 for {
41 var msg Message
42 if err := msg.readPoEntry(r); err != nil {
43 if err == io.EOF {
44 return &file, nil
45 }
46 return nil, err
47 }
48 if msg.MsgId == "" {
49 file.MimeHeader.parseHeader(&msg)
50 continue
51 }
52 file.Messages = append(file.Messages, msg)
53 }
54 }
55
56
57 func (f *File) Save(name string) error {
58 return ioutil.WriteFile(name, []byte(f.String()), 0666)
59 }
60
61
62 func (f *File) Data() []byte {
63
64 var messages []Message
65 messages = append(messages, f.Messages...)
66 sort.Slice(messages, func(i, j int) bool {
67 return messages[i].less(&messages[j])
68 })
69
70 var buf bytes.Buffer
71 fmt.Fprintf(&buf, "%s\n", f.MimeHeader.String())
72 for i := 0; i < len(messages); i++ {
73 fmt.Fprintf(&buf, "%s\n", messages[i].String())
74 }
75 return buf.Bytes()
76 }
77
78
79 func (f *File) String() string {
80 return string(f.Data())
81 }
82
View as plain text