Go back to using pop3.Message rather than IDs for most pop3.Mailbox methods.
authorRobert Sesek <rsesek@bluestatic.org>
Tue, 13 Dec 2016 19:26:02 +0000 (14:26 -0500)
committerRobert Sesek <rsesek@bluestatic.org>
Tue, 13 Dec 2016 19:26:02 +0000 (14:26 -0500)
But also add a Mailbox.GetMessage method to make it easier to convert.

pop3.go
pop3/conn.go
pop3/server.go

diff --git a/pop3.go b/pop3.go
index ad4d1a4739fcd563e02702acf4648cf508e80bef..6d8dfd26949e28cac89cfb6d1bce89ae91db7f88 100644 (file)
--- a/pop3.go
+++ b/pop3.go
@@ -123,20 +123,20 @@ func (mb *mailbox) ListMessages() ([]pop3.Message, error) {
        return msgs, nil
 }
 
-func (mb *mailbox) Retrieve(idx int) (io.ReadCloser, error) {
-       if idx > len(mb.messages) {
-               return nil, errors.New("no such message")
+func (mb *mailbox) GetMessage(id int) pop3.Message {
+       if id > len(mb.messages) {
+               return nil
        }
-       filename := mb.messages[idx-1].filename
+       return &mb.messages[id-1]
+}
+
+func (mb *mailbox) Retrieve(msg pop3.Message) (io.ReadCloser, error) {
+       filename := msg.(*message).filename
        return os.Open(filename)
 }
 
-func (mb *mailbox) Delete(idx int) error {
-       message := &mb.messages[idx-1]
-       if message.deleted {
-               return errors.New("already deleted")
-       }
-       message.deleted = true
+func (mb *mailbox) Delete(msg pop3.Message) error {
+       msg.(*message).deleted = true
        return nil
 }
 
index 5341bcbd68988c6f6d73ff3c141373ac7a3dc07b..91a25437fe52ba4813647926f3f65d08ba36b358 100644 (file)
@@ -196,12 +196,12 @@ func (conn *connection) doRETR() {
                return
        }
 
-       idx, ok := conn.intParam()
-       if !ok {
+       msg := conn.getRequestedMessage()
+       if msg == nil {
                return
        }
 
-       rc, err := conn.mb.Retrieve(idx)
+       rc, err := conn.mb.Retrieve(msg)
        if err != nil {
                conn.err(err.Error())
                return
@@ -218,12 +218,12 @@ func (conn *connection) doDELE() {
                return
        }
 
-       idx, ok := conn.intParam()
-       if !ok {
+       msg := conn.getRequestedMessage()
+       if msg == nil {
                return
        }
 
-       if err := conn.mb.Delete(idx); err != nil {
+       if err := conn.mb.Delete(msg); err != nil {
                conn.err(err.Error())
        } else {
                conn.ok("")
@@ -239,12 +239,23 @@ func (conn *connection) doRSET() {
        conn.ok("")
 }
 
-func (conn *connection) intParam() (int, bool) {
+func (conn *connection) getRequestedMessage() Message {
        var cmd string
-       var param int
-       if _, err := fmt.Sscanf(conn.line, "%s %d", &cmd, &param); err != nil {
+       var idx int
+       if _, err := fmt.Sscanf(conn.line, "%s %d", &cmd, &idx); err != nil {
                conn.err(errSyntax)
-               return 0, false
+               return nil
        }
-       return param, true
+
+       if idx < 1 {
+               conn.err("invalid message-number")
+               return nil
+       }
+
+       msg := conn.mb.GetMessage(idx)
+       if msg == nil {
+               conn.err("no such message")
+               return nil
+       }
+       return msg
 }
index f0377b54bcab62c4dca5c7ecd09b6b872714195f..6e5dc366dab453a641b2581f379f41beb494a11c 100644 (file)
@@ -12,8 +12,9 @@ type Message interface {
 
 type Mailbox interface {
        ListMessages() ([]Message, error)
-       Retrieve(int) (io.ReadCloser, error)
-       Delete(int) error
+       GetMessage(int) Message
+       Retrieve(Message) (io.ReadCloser, error)
+       Delete(Message) error
        Close() error
        Reset()
 }