simplify save and parts cmd by replacing channels with string slices
3 files changed, 19 insertions(+), 37 deletions(-)

M cmd/mb/main.go
M command.go
M list.go
M cmd/mb/main.go +8 -29
@@ 132,14 132,10 @@ func main() {
 			src.Close()
 			break
 		}
-		// todo: save more than one part?
-		// otherwise the channel would make no sense, we can return string
-		files := make(chan string)
-		go func() {
-			err = mb.Save(files, msg, part)
-			close(files)
-		}()
-		for file := range files {
+		// todo: save more than one part by using matchers
+		var files []string
+		files, err = mb.Save(msg, part)
+		for _, file := range files {
 			os.Stdout.WriteString(file + "\n")
 		}
 		if err != nil {

          
@@ 159,15 155,10 @@ func main() {
 			src.Close()
 			break
 		}
-		parts := make(chan string)
-		go func() {
-			err = mb.Parts(parts, msg)
-			close(parts)
-		}()
-		var i int64 = 1
-		for part := range parts {
-			os.Stdout.WriteString(strconv.FormatInt(i, 10) + ": " + part + "\n")
-			i++
+		var parts []string
+		parts, err = mb.Parts(msg)
+		for i, part := range parts {
+			os.Stdout.WriteString(strconv.Itoa(i+1) + ": " + part + "\n")
 		}
 		if err != nil {
 			src.Close()

          
@@ 363,18 354,6 @@ func parseRegexpCmd(args []string) (stri
 // signature support
 // encryption support
 
-func printParts(msg *mail.Message) (err error) {
-	parts := make(chan string)
-	go func() {
-		err = mb.Parts(parts, msg)
-		close(parts)
-	}()
-	for part := range parts {
-		os.Stdout.WriteString(part + "\n")
-	}
-	return
-}
-
 /*
 func mainSocket() {
 	c, err := net.Dial("unix", "/tmp/mbs.sock")

          
M command.go +10 -7
@@ 62,8 62,9 @@ func partError(no int, msg string) error
 	return errors.New("mime part " + strconv.Itoa(no) + ": " + msg)
 }
 
-// todo: we need a part matcher or what?
-func Save(files chan string, msg *mail.Message, number int) error {
+// todo: implement matcher
+func Save(msg *mail.Message, number int) ([]string, error) {
+	var files []string
 	saver := func(p part, no int) error {
 		if no != number {
 			return nil

          
@@ 88,22 89,24 @@ func Save(files chan string, msg *mail.M
 		if _, err = io.Copy(f, in); err != nil {
 			return partError(no, err.Error())
 		}
-		files <- f.Name()
+		files = append(files, f.Name())
 		if err = f.Close(); err != nil {
 			return partError(no, err.Error())
 		}
 		return nil
 	}
-	return parse(msg, saver)
+	return files, parse(msg, saver)
 }
 
 // todo: print something like "inbox/33:1 <header>"?
-func Parts(parts chan string, msg *mail.Message) error {
+func Parts(msg *mail.Message) ([]string, error) {
+	var parts []string
+
 	partsLister := func(p part, no int) error {
-		parts <- p.Header.Get("Content-Type")
+		parts = append(parts, p.Header.Get("Content-Type"))
 		return nil
 	}
-	return parse(msg, partsLister)
+	return parts, parse(msg, partsLister)
 }
 
 func ViewPart(dst io.Writer, msg *mail.Message, number int) error {

          
M list.go +1 -1
@@ 15,7 15,7 @@ var oneDayAhead = time.Now().Add(24 * ti
 func List(mbox Mailbox, dst io.Writer, folder string, pick *Sequence) error {
 	msgs, err := mbox.ReadFolder(folder)
 	if err != nil && msgs == nil {
-		// don't leave now, show as much as we can
+		// don't leave if we have msg, show as much as we can
 		return err
 	}
 	out := bufio.NewWriter(dst)