aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/emersion/go-imap/command.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/emersion/go-imap/command.go')
-rw-r--r--vendor/github.com/emersion/go-imap/command.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/vendor/github.com/emersion/go-imap/command.go b/vendor/github.com/emersion/go-imap/command.go
new file mode 100644
index 0000000..dac2696
--- /dev/null
+++ b/vendor/github.com/emersion/go-imap/command.go
@@ -0,0 +1,57 @@
+package imap
+
+import (
+ "errors"
+ "strings"
+)
+
+// A value that can be converted to a command.
+type Commander interface {
+ Command() *Command
+}
+
+// A command.
+type Command struct {
+ // The command tag. It acts as a unique identifier for this command. If empty,
+ // the command is untagged.
+ Tag string
+ // The command name.
+ Name string
+ // The command arguments.
+ Arguments []interface{}
+}
+
+// Implements the Commander interface.
+func (cmd *Command) Command() *Command {
+ return cmd
+}
+
+func (cmd *Command) WriteTo(w *Writer) error {
+ tag := cmd.Tag
+ if tag == "" {
+ tag = "*"
+ }
+
+ fields := []interface{}{RawString(tag), RawString(cmd.Name)}
+ fields = append(fields, cmd.Arguments...)
+ return w.writeLine(fields...)
+}
+
+// Parse a command from fields.
+func (cmd *Command) Parse(fields []interface{}) error {
+ if len(fields) < 2 {
+ return errors.New("imap: cannot parse command: no enough fields")
+ }
+
+ var ok bool
+ if cmd.Tag, ok = fields[0].(string); !ok {
+ return errors.New("imap: cannot parse command: invalid tag")
+ }
+ if cmd.Name, ok = fields[1].(string); !ok {
+ return errors.New("imap: cannot parse command: invalid name")
+ }
+ cmd.Name = strings.ToUpper(cmd.Name) // Command names are case-insensitive
+
+ cmd.Arguments = fields[2:]
+ return nil
+}