add.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package main
  2. import (
  3. "bufio"
  4. "bytes"
  5. "flag"
  6. "fmt"
  7. "io"
  8. "io/ioutil"
  9. "os"
  10. "git.sr.ht/~blallo/papero/cli"
  11. "git.sr.ht/~blallo/papero/imaputils"
  12. )
  13. var addVerbs cli.CommandMap
  14. func init() {
  15. addVerbs = cli.CommandMap{
  16. "message": PutMessageCmd{},
  17. // "mailbox": CreateMailboxCmd{},
  18. }
  19. }
  20. type AddCmd struct{}
  21. func (a AddCmd) Func(args []string) error {
  22. flagset := flag.NewFlagSet(args[0], flag.ExitOnError)
  23. flagset.Usage = func() { a.Help(os.Stdout, flagset) }
  24. flagset.Parse(args[1:])
  25. subArgs := flagset.Args()
  26. if len(subArgs) == 0 {
  27. a.Help(os.Stderr, flagset)
  28. os.Exit(1)
  29. }
  30. cmd := subArgs[0]
  31. if Session.Info.Opts.Debug {
  32. Log.Debug("add verb:", cmd)
  33. }
  34. return addVerbs[cmd].Func(subArgs)
  35. }
  36. func (a AddCmd) Help(w io.Writer, set *flag.FlagSet) {
  37. fmt.Fprintf(w, "USAGE: %s add VERB [verb opts]\n", Session.Info.Name)
  38. fmt.Fprintf(w, "\nVERBS:\n")
  39. for verb := range addVerbs {
  40. fmt.Fprintf(w, "\t%s\n", verb)
  41. }
  42. }
  43. // VERBS
  44. type PutMessageCmd struct{}
  45. func (pm PutMessageCmd) Func(args []string) error {
  46. var opts imaputils.PutMessageOpts
  47. var err error
  48. var bodyReader io.Reader
  49. var flagSeen, flagAnswered, flagFlagged, flagDeleted, flagDraft bool
  50. var messageTime = cli.NewAbsTimeFlag()
  51. if Session.Info.Opts.Debug {
  52. Log.Debug("enter add message")
  53. }
  54. flagset := flag.NewFlagSet(args[0], flag.ExitOnError)
  55. flagset.BoolVar(&flagSeen, "seen", false, "set the seen flag")
  56. flagset.BoolVar(&flagAnswered, "answered", false, "set the answered flag")
  57. flagset.BoolVar(&flagFlagged, "flagged", false, "set the flagged flag")
  58. flagset.BoolVar(&flagDeleted, "deleted", false, "set the deleted flag")
  59. flagset.BoolVar(&flagDraft, "draft", false, "set the draft flag")
  60. flagset.Var(&messageTime, "time", "time at which the message has been sent")
  61. flagset.Usage = func() {
  62. pm.Help(os.Stdout, flagset)
  63. }
  64. flagset.Parse(args[1:])
  65. subArgs := flagset.Args()
  66. if len(subArgs) != 2 {
  67. Log.Debugf("Too few arguments: %s\n", subArgs)
  68. pm.Help(os.Stderr, flagset)
  69. os.Exit(1)
  70. }
  71. opts.Debug = Session.Info.Opts.Debug
  72. opts.Mailbox = subArgs[0]
  73. if subArgs[1] == "-" {
  74. bodyReader = os.Stdin
  75. } else {
  76. file, err := os.Open(subArgs[1])
  77. if err != nil {
  78. return err
  79. }
  80. bodyReader = bufio.NewReader(file)
  81. }
  82. opts.Body, err = readIntoBuffer(bodyReader)
  83. if err != nil {
  84. return err
  85. }
  86. opts.Flags = intoList(flagSeen, flagAnswered, flagFlagged, flagDeleted, flagDraft)
  87. opts.Time = *messageTime.Time
  88. Log.Debugf("Opts: %+v\n", opts)
  89. imaputils.PutMessage(Session.Config, &opts)
  90. return nil
  91. }
  92. func (pm PutMessageCmd) Help(w io.Writer, set *flag.FlagSet) {
  93. fmt.Fprintf(w, "USAGE: %s set put MAILBOX PATH_OR_STDIN\n", Session.Info.Name)
  94. fmt.Fprintln(w, "\nPATH_OR_STDIN being either a path to a file or `-` to accept input from stdin")
  95. set.PrintDefaults()
  96. }
  97. func readIntoBuffer(r io.Reader) (*bytes.Buffer, error) {
  98. var empty bytes.Buffer
  99. b, err := ioutil.ReadAll(r)
  100. if err != nil {
  101. return &empty, err
  102. }
  103. Log.Debugf("content %+v\n", b)
  104. buff := bytes.NewBuffer(b)
  105. return buff, nil
  106. }
  107. func intoList(flagSeen, flagAnswered, flagFlagged, flagDeleted, flagDraft bool) []string {
  108. var result []string
  109. if flagSeen {
  110. result = append(result, "seen")
  111. }
  112. if flagAnswered {
  113. result = append(result, "answered")
  114. }
  115. if flagFlagged {
  116. result = append(result, "flagged")
  117. }
  118. if flagDeleted {
  119. result = append(result, "deleted")
  120. }
  121. if flagDraft {
  122. result = append(result, "draft")
  123. }
  124. return result
  125. }