package main import ( "flag" "fmt" "io" "os" "git.lattuga.net/blallo/papero/cli" "git.lattuga.net/blallo/papero/imaputils" ) var infoVerbs cli.CommandMap func init() { lsMailbox := LsMailboxCmd{} lsMessages := LsMsgCmd{} catMessage := CatMsgCmd{} infoVerbs = cli.CommandMap{ "list-mailboxes": lsMailbox, "list-messages": lsMessages, "display-message": catMessage, } } type InfoCmd struct{} func (i InfoCmd) Func(args []string) error { flagset := flag.NewFlagSet(args[0], flag.ExitOnError) flagset.Usage = func() { i.Help(os.Stdout, flagset) } flagset.Parse(args[1:]) subArgs := flagset.Args() if len(subArgs) == 0 { i.Help(os.Stderr, flagset) os.Exit(1) } cmd := subArgs[0] if Session.Info.Opts.Debug { Log.Debug("info verb:", cmd) } return infoVerbs[cmd].Func(subArgs) } func (i InfoCmd) Help(w io.Writer, set *flag.FlagSet) { fmt.Fprintf(w, "USAGE: %s info VERB [verb opts]\n", Session.Info.Name) fmt.Fprintf(w, "\nVERBS:\n") for verb := range infoVerbs { fmt.Fprintf(w, "\t%s\n", verb) } } // VERBS type LsMailboxCmd struct{} func (l LsMailboxCmd) Func(args []string) error { if Session.Info.Opts.Debug { Log.Debug("enter info list-mailboxes") } var withAttributes bool flagset := flag.NewFlagSet(args[0], flag.ExitOnError) flagset.BoolVar(&withAttributes, "with-attrs", false, "toggle attributes display") flagset.Usage = func() { l.Help(os.Stdout, flagset) } flagset.Parse(args[1:]) mboxInfo, err := imaputils.ListMailboxes(Session.Config, Session.Info.Opts.Debug) if err != nil { return err } if Session.Info.Opts.Debug { Log.Debug(mboxInfo) } for _, box := range mboxInfo { if withAttributes { attrs := fmt.Sprint(box.Attributes) fmt.Printf("%s (attrs: %s)", box.Name, attrs) } else { fmt.Println(box.Name) } } return nil } func (l LsMailboxCmd) Help(w io.Writer, set *flag.FlagSet) { fmt.Fprintf(w, "USAGE: %s info list-mailboxes\n", Session.Info.Name) set.PrintDefaults() } type LsMsgCmd struct{} func (l LsMsgCmd) Func(args []string) error { if Session.Info.Opts.Debug { Log.Debug("enter info list-messages") } var limit uint flagset := flag.NewFlagSet(args[0], flag.ExitOnError) flagset.UintVar(&limit, "limit", 0, "maximum number of messages to display (0 means no limit)") flagset.Usage = func() { l.Help(os.Stdout, flagset) } flagset.Parse(args[1:]) subArgs := flagset.Args() if len(subArgs) != 1 { l.Help(os.Stderr, flagset) os.Exit(1) } return nil } func (l LsMsgCmd) Help(w io.Writer, set *flag.FlagSet) { fmt.Fprintf(w, "USAGE: %s info list-messages [opts] MAILBOX_NAME\n", Session.Info.Name) fmt.Fprintf(w, "\nOPTS:\n") set.PrintDefaults() } type CatMsgCmd struct{} func (c CatMsgCmd) Func(args []string) error { if Session.Info.Opts.Debug { Log.Debug("enter info display-message") } flagset := flag.NewFlagSet(args[0], flag.ExitOnError) flagset.Usage = func() { c.Help(os.Stdout, flagset) } flagset.Parse(args[1:]) subArgs := flagset.Args() if len(subArgs) != 1 { c.Help(os.Stderr, flagset) os.Exit(1) } return nil } func (c CatMsgCmd) Help(w io.Writer, set *flag.FlagSet) { fmt.Fprintf(w, "USAGE: %s info display-message MAILBOX_NAME MESSAGE_ID\n", Session.Info.Name) set.PrintDefaults() }