Simple mbox parser.

This commit is contained in:
Bill Thiede 2017-12-26 12:33:33 -08:00
parent 0f066809b2
commit e2854cac2f
2 changed files with 116 additions and 0 deletions

View File

@ -0,0 +1,65 @@
package main
import (
"bufio"
"bytes"
"flag"
"io"
"os"
"github.com/golang/glog"
)
func writeMailderFile(b []byte) error { return nil }
func parse(r io.Reader, writeMessage func(b []byte) error) error {
from := []byte("From ")
scanner := bufio.NewScanner(r)
buf := new(bytes.Buffer)
for scanner.Scan() {
b := scanner.Bytes()
if bytes.HasPrefix(b, from) {
// New message
if buf.Len() > 0 {
msg := buf.Bytes()
// Trim empty line from end of mbox message
msg = msg[:len(msg)-1]
if err := writeMessage(msg); err != nil {
return err
}
}
buf.Reset()
}
buf.Write(b)
buf.Write([]byte("\n"))
}
if buf.Len() > 0 {
if err := writeMessage(buf.Bytes()); err != nil {
return err
}
}
return scanner.Err()
}
func parseFile(p string) error {
r, err := os.Open(p)
if err != nil {
return err
}
defer r.Close()
if err := parse(r, writeMailderFile); err != nil {
return err
}
return nil
}
func main() {
flag.Parse()
defer glog.Flush()
for _, path := range flag.Args() {
if err := parseFile(path); err != nil {
glog.Errorf("Failed to parse %q: %v", err)
}
}
}

View File

@ -0,0 +1,51 @@
package main
import (
"bytes"
"strings"
"testing"
)
func TestParse(t *testing.T) {
const input = `From user1
Body 1
From user2
Body 2 with From in it.
From user3
Body 3
`
wants := []string{
`From user1
Body 1
`,
`From user2
Body 2 with From in it.
`,
`From user3
Body 3
`,
}
msgN := 0
testWriteMessage := func(got []byte) error {
want := wants[msgN]
if !bytes.Equal([]byte(want), got) {
t.Errorf("msg[%d] = %q, want %q", msgN, got, want)
}
msgN++
return nil
}
if err := parse(strings.NewReader(input), testWriteMessage); err != nil {
t.Errorf("parse() failed: %v", err)
}
if msgN != len(wants) {
t.Errorf("Parsed %d messages, expected %d", msgN, len(wants))
}
}