package main import ( "bufio" "bytes" "flag" "fmt" "io" "io/ioutil" "os" "git.sr.ht/~blallo/papero/cli" "git.sr.ht/~blallo/papero/imaputils" ) var addVerbs cli.CommandMap func init() { addVerbs = cli.CommandMap{ "message": PutMessageCmd{}, // "mailbox": CreateMailboxCmd{}, } } type AddCmd struct{} func (a AddCmd) Func(args []string) error { flagset := flag.NewFlagSet(args[0], flag.ExitOnError) flagset.Usage = func() { a.Help(os.Stdout, flagset) } flagset.Parse(args[1:]) subArgs := flagset.Args() if len(subArgs) == 0 { a.Help(os.Stderr, flagset) os.Exit(1) } cmd := subArgs[0] if Session.Info.Opts.Debug { Log.Debug("add verb:", cmd) } return addVerbs[cmd].Func(subArgs) } func (a AddCmd) Help(w io.Writer, set *flag.FlagSet) { fmt.Fprintf(w, "USAGE: %s add VERB [verb opts]\n", Session.Info.Name) fmt.Fprintf(w, "\nVERBS:\n") for verb := range addVerbs { fmt.Fprintf(w, "\t%s\n", verb) } } // VERBS type PutMessageCmd struct{} func (pm PutMessageCmd) Func(args []string) error { var opts imaputils.PutMessageOpts var err error var bodyReader io.Reader var flagSeen, flagAnswered, flagFlagged, flagDeleted, flagDraft bool var messageTime = cli.NewAbsTimeFlag() if Session.Info.Opts.Debug { Log.Debug("enter add message") } flagset := flag.NewFlagSet(args[0], flag.ExitOnError) flagset.BoolVar(&flagSeen, "seen", false, "set the seen flag") flagset.BoolVar(&flagAnswered, "answered", false, "set the answered flag") flagset.BoolVar(&flagFlagged, "flagged", false, "set the flagged flag") flagset.BoolVar(&flagDeleted, "deleted", false, "set the deleted flag") flagset.BoolVar(&flagDraft, "draft", false, "set the draft flag") flagset.Var(&messageTime, "time", "time at which the message has been sent") flagset.Usage = func() { pm.Help(os.Stdout, flagset) } flagset.Parse(args[1:]) subArgs := flagset.Args() if len(subArgs) != 2 { Log.Debugf("Too few arguments: %s\n", subArgs) pm.Help(os.Stderr, flagset) os.Exit(1) } opts.Debug = Session.Info.Opts.Debug opts.Mailbox = subArgs[0] if subArgs[1] == "-" { bodyReader = os.Stdin } else { file, err := os.Open(subArgs[1]) if err != nil { return err } bodyReader = bufio.NewReader(file) } opts.Body, err = readIntoBuffer(bodyReader) if err != nil { return err } opts.Flags = intoList(flagSeen, flagAnswered, flagFlagged, flagDeleted, flagDraft) opts.Time = *messageTime.Time Log.Debugf("Opts: %+v\n", opts) imaputils.PutMessage(Session.Config, &opts) return nil } func (pm PutMessageCmd) Help(w io.Writer, set *flag.FlagSet) { fmt.Fprintf(w, "USAGE: %s set put MAILBOX PATH_OR_STDIN\n", Session.Info.Name) fmt.Fprintln(w, "\nPATH_OR_STDIN being either a path to a file or `-` to accept input from stdin") set.PrintDefaults() } func readIntoBuffer(r io.Reader) (*bytes.Buffer, error) { var empty bytes.Buffer b, err := ioutil.ReadAll(r) if err != nil { return &empty, err } Log.Debugf("content %+v\n", b) buff := bytes.NewBuffer(b) return buff, nil } func intoList(flagSeen, flagAnswered, flagFlagged, flagDeleted, flagDraft bool) []string { var result []string if flagSeen { result = append(result, "seen") } if flagAnswered { result = append(result, "answered") } if flagFlagged { result = append(result, "flagged") } if flagDeleted { result = append(result, "deleted") } if flagDraft { result = append(result, "draft") } return result }