Simple mbox parser.
This commit is contained in:
parent
0f066809b2
commit
e2854cac2f
65
cmd/mbox2maildir/mbox2maildir.go
Normal file
65
cmd/mbox2maildir/mbox2maildir.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
51
cmd/mbox2maildir/mbox2maildir_test.go
Normal file
51
cmd/mbox2maildir/mbox2maildir_test.go
Normal 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))
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user