use int64 instead of string for msg id - nmh is about numbered files; improve mh.Append
5 files changed, 35 insertions(+), 30 deletions(-)

M cmd/mb/main.go
M command.go
M list.go
M mh/mh.go
M sequence.go
M cmd/mb/main.go +5 -4
@@ 214,6 214,7 @@ func main() {
 			}
 		}
 		if len(picked) > 0 {
+			// main must not know how a filename is created TODO
 			os.Stdout.WriteString(path.Join(folder, strings.Join(picked, ",")) + "\n")
 		}
 	case "new":

          
@@ 360,10 361,10 @@ func main() {
 			break
 		}
 		folder := os.Args[2]
-		var msgId string
-		msgId, err = mbox.Append(folder, os.Stdin)
-		if len(msgId) > 0 {
-			os.Stdout.WriteString(path.Join(folder, msgId) + "\n")
+		var msg string
+		msg, err = mbox.Append(folder, os.Stdin)
+		if len(msg) > 0 {
+			os.Stdout.WriteString(msg + "\n")
 		}
 	case "pack": // rename to sort, as we gonna sort by date
 		if len(os.Args) < 3 {

          
M command.go +5 -5
@@ 19,7 19,7 @@ import (
 )
 
 // its not an error if no match is found.
-func walk(mbox *mh.Mailbox, folder string, seq *Sequence, proc func(string) error) error {
+func walk(mbox *mh.Mailbox, folder string, seq *Sequence, proc func(int64) error) error {
 	// todo: let only sorted msgs out here
 	msgs, err := mbox.ReadFolder(folder)
 	if err != nil {

          
@@ 29,8 29,8 @@ func walk(mbox *mh.Mailbox, folder strin
 	// in the correct time order
 	// todo: see above, need sorted list
 	for j := range msgs {
-		if seq.Matches(msgs[j].Id) {
-			if err = proc(strconv.FormatInt(msgs[j].Id, 10)); err != nil {
+		if seq.IsMatch(msgs[j].Id) {
+			if err = proc(msgs[j].Id); err != nil {
 				return err
 			}
 		}

          
@@ 39,14 39,14 @@ func walk(mbox *mh.Mailbox, folder strin
 }
 
 func Move(mbox *mh.Mailbox, srcFolder string, msgs *Sequence, dst string) error {
-	proc := func(id string) error {
+	proc := func(id int64) error {
 		return mbox.Move(srcFolder, dst, id)
 	}
 	return walk(mbox, srcFolder, msgs, proc)
 }
 
 func Remove(mbox *mh.Mailbox, folder string, msgs *Sequence) error {
-	proc := func(id string) error {
+	proc := func(id int64) error {
 		return mbox.Remove(folder, id)
 	}
 	return walk(mbox, folder, msgs, proc)

          
M list.go +1 -1
@@ 29,7 29,7 @@ func List(mbox *mh.Mailbox, dst io.Write
 		fType = defaultFolderType
 	}
 	for _, msg := range msgs {
-		if !pick.Matches(msg.Id) {
+		if !pick.IsMatch(msg.Id) {
 			continue
 		}
 		header := msg.Header

          
M mh/mh.go +23 -19
@@ 58,16 58,20 @@ func (mh *Mailbox) osPath(elem ...string
 	return path.Join(mh.mailDir, strings.Join(elem, "/"))
 }
 
+func (mh *Mailbox) msgFile(folder string, msgid int64) string {
+	return path.Join(mh.mailDir, folder, strconv.FormatInt(msgid, 10))
+}
+
 // todo: we sort mails in ReadFolder, could use this here
-func (mh *Mailbox) nextId(folder string) (string, error) {
+func (mh *Mailbox) nextId(folder string) (int64, error) {
 	if err := mh.lock(); err != nil {
-		return "", err
+		return 0, err
 	}
 	defer mh.unlock()
 
 	list, err := mh.readDir(folder)
 	if err != nil {
-		return "", err
+		return 0, err
 	}
 	var max int64
 	for i := range list {

          
@@ 82,7 86,7 @@ func (mh *Mailbox) nextId(folder string)
 			max = id
 		}
 	}
-	return strconv.FormatInt(max+1, 10), nil
+	return max, nil
 }
 
 func (mbox Mailbox) FolderType(folder string) (int, bool) {

          
@@ 129,7 133,7 @@ func (mbox Mailbox) ReadFolder(folder st
 	return mails, err
 }
 
-func (mh *Mailbox) Append(folder string, msg io.Reader) (string, error) {
+func (mh *Mailbox) Append(folder string, msg io.Reader) (newMsg string, err error) {
 	if err := mh.lock(); err != nil {
 		return "", err
 	}

          
@@ 138,19 142,20 @@ func (mh *Mailbox) Append(folder string,
 	if err != nil {
 		return "", err
 	}
-	file, err := os.OpenFile(mh.osPath(folder, id),
-		os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
+	newMsg = mh.msgFile(folder, id)
+	var file *os.File
+	file, err = os.OpenFile(mh.msgFile(folder, id), os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600)
 	if err != nil {
-		return id, err
+		return
 	}
 	if _, err = io.Copy(file, msg); err != nil {
 		file.Close()
-		return "", err
+		return
 	}
-	if err := file.Close(); err != nil {
-		return "", err
+	if err = file.Close(); err != nil {
+		return
 	}
-	return id, mh.unlock()
+	return mh.msgFile(folder, id), mh.unlock()
 }
 
 func errMail(id int64, err error) Message {

          
@@ 211,8 216,8 @@ func (mh *Mailbox) readDir(folder string
 	return msgs, f.Close()
 }
 
-func (mh *Mailbox) rename(fOld, old, fNew, new string) error {
-	return os.Rename(mh.osPath(fOld, old), mh.osPath(fNew, new))
+func (mh *Mailbox) rename(fOld string, old int64, fNew string, new int64) error {
+	return os.Rename(mh.msgFile(fOld, old), mh.msgFile(fNew, new))
 }
 
 // todo: sort by date, use case: very old msg is moved into a folder

          
@@ 235,14 240,13 @@ func (mh *Mailbox) Pack(folder string) e
 	}
 	// then rename the rest
 	for ; i < len(msgs); i++ {
-		if err = mh.rename(folder, strconv.FormatInt(msgs[i].Id, 10),
-			folder, strconv.Itoa(i+1)); err != nil {
+		if err = mh.rename(folder, msgs[i].Id, folder, int64(i+1)); err != nil {
 			return err
 		}
 	}
 	return mh.unlock()
 }
-func (mh *Mailbox) Move(src, dst, msgid string) error {
+func (mh *Mailbox) Move(src, dst string, msgid int64) error {
 	if err := mh.lock(); err != nil {
 		return err
 	}

          
@@ 257,13 261,13 @@ func (mh *Mailbox) Move(src, dst, msgid 
 	return mh.unlock()
 }
 
-func (mh *Mailbox) Remove(folder, msg string) error {
+func (mh *Mailbox) Remove(folder string, msg int64) error {
 	if err := mh.lock(); err != nil {
 		return err
 	}
 	defer mh.unlock()
 
-	if err := os.Remove(mh.osPath(folder, msg)); err != nil {
+	if err := os.Remove(mh.msgFile(folder, msg)); err != nil {
 		return err
 	}
 	return mh.unlock()

          
M sequence.go +1 -1
@@ 16,7 16,7 @@ type Sequence struct {
 	exact   []int64
 }
 
-func (s Sequence) Matches(n int64) bool {
+func (s Sequence) IsMatch(n int64) bool {
 	for _, match := range s.exact {
 		if match == n {
 			return true