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
}
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
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("")
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, ¶m); 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
}
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()
}