123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- 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
- }
|