implement edit case in main; other small fixes
5 files changed, 34 insertions(+), 10 deletions(-)

M cmd/mb/main.go
M command.go
M config.go
M decode.go
M edit.go
M cmd/mb/main.go +18 -2
@@ 278,8 278,24 @@ func main() {
 			err = err1
 		}
 	case "edit":
-		// todo: implement this
-		err = errors.New(cmd + ": not implemented")
+		var src io.ReadCloser = os.Stdin
+		if len(os.Args) > 2 {
+			if src, err = openMsg(mbox, os.Args[2]); err != nil {
+				break
+			}
+		}
+		var msg *mail.Message
+		if msg, err = mail.ReadMessage(src); err != nil {
+			src.Close()
+			break
+		}
+		var name string
+		if name, err = mb.Edit(mbox, msg); len(name) > 0 {
+			os.Stdout.WriteString(name + "\n")
+		}
+		if err1 := src.Close(); err == nil {
+			err = err1
+		}
 	case "send":
 		var src io.ReadCloser = os.Stdin
 		if len(os.Args) > 2 {

          
M command.go +2 -2
@@ 121,7 121,7 @@ func anno(w io.Writer, p part, no int) e
 	return err
 }
 
-func newPlainTextPrinter(dst io.Writer, t transform.Transformer, anno func(io.Writer, part, int) error) func(part, int) error {
+func newPlainTextDecoder(dst io.Writer, t transform.Transformer, anno func(io.Writer, part, int) error) func(part, int) error {
 	return func(p part, no int) error {
 		// todo: if the msg has no content type header, this will return "mime: no media type"
 		mt, _, err := mime.ParseMediaType(p.Header.Get("Content-Type"))

          
@@ 156,7 156,7 @@ func View(dst io.Writer, msg *mail.Messa
 	if _, err := io.Copy(dst, &b); err != nil {
 		return err
 	}
-	return parse(msg, newPlainTextPrinter(dst, transform.Nop, anno))
+	return parse(msg, newPlainTextDecoder(dst, transform.Nop, anno))
 }
 
 func Send(msg *mail.Message) error {

          
M config.go +1 -1
@@ 20,7 20,7 @@ var (
 	// editor is a program to edit mails.
 	//
 	// This editor has to be UTF-8 capable.
-	editor = "/usr/bin/nvi"
+	editor = "vim"
 
 	// viewHeader holds a list of mail header fields, as described in RFC 5322.
 	// These fields and their values will be shown when viewing a mail.

          
M decode.go +12 -4
@@ 22,6 22,14 @@ func (d decoder) safeDecodeHeader(key st
 	return value
 }
 
+var dec = &mime.WordDecoder{CharsetReader: func(charset string, input io.Reader) (io.Reader, error) {
+	cr, err := decodeCharSet(charset)
+	if err != nil {
+		return nil, err
+	}
+	return transform.NewReader(input, cr), nil
+}}
+
 func newDecoder() decoder {
 	dec := new(mime.WordDecoder)
 	dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) {

          
@@ 35,12 43,12 @@ func newDecoder() decoder {
 }
 
 func decodeCharSet(charset string) (transform.Transformer, error) {
-	switch strings.ToUpper(charset) {
-	case "ISO-8859-1", "WINDOWS-1252":
+	switch strings.ToLower(charset) {
+	case "iso-8859-1", "windows-1252":
 		return charmap.Windows1252.NewDecoder(), nil
-	case "ISO-8859-15":
+	case "iso-8859-15":
 		return charmap.ISO8859_15.NewDecoder(), nil
-	case "UTF-8", "US-ASCII": // actually, we need to replace us ascii > 0x7f with something
+	case "utf-8", "us-ascii": // actually, we need to replace us ascii > 0x7f with something
 		return transform.Nop, nil
 	}
 	return nil, errors.New("unknown charset '" + charset + "'")

          
M edit.go +1 -1
@@ 260,7 260,7 @@ func fmtReply(dst io.Writer, sender stri
 			parseAddressList(h.Get("From"))); err != nil {
 			return err
 		}
-		if err := parse(msg, newPlainTextPrinter(dst, &quoteMessage{true}, anno)); err != nil {
+		if err := parse(msg, newPlainTextDecoder(dst, &quoteMessage{true}, anno)); err != nil {
 			return err
 		}
 	}