summaryrefslogtreecommitdiff
path: root/commands/account
diff options
context:
space:
mode:
Diffstat (limited to 'commands/account')
-rw-r--r--commands/account/rmdir.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/commands/account/rmdir.go b/commands/account/rmdir.go
new file mode 100644
index 0000000..ed24ca5
--- /dev/null
+++ b/commands/account/rmdir.go
@@ -0,0 +1,96 @@
+package account
+
+import (
+ "errors"
+ "time"
+
+ "git.sr.ht/~sircmpwn/getopt"
+
+ "git.sr.ht/~sircmpwn/aerc/widgets"
+ "git.sr.ht/~sircmpwn/aerc/worker/types"
+)
+
+type RemoveDir struct{}
+
+func init() {
+ register(RemoveDir{})
+}
+
+func (RemoveDir) Aliases() []string {
+ return []string{"rmdir"}
+}
+
+func (RemoveDir) Complete(aerc *widgets.Aerc, args []string) []string {
+ return nil
+}
+
+func (RemoveDir) Execute(aerc *widgets.Aerc, args []string) error {
+ acct := aerc.SelectedAccount()
+ if acct == nil {
+ return errors.New("No account selected")
+ }
+
+ force := false
+
+ opts, optind, err := getopt.Getopts(args, "f")
+ if err != nil {
+ return err
+ }
+ for _, opt := range opts {
+ switch opt.Option {
+ case 'f':
+ force = true
+ }
+ }
+
+ if len(args) != optind {
+ return errors.New("Usage: rmdir [-f]")
+ }
+
+ // Check for any messages in the directory.
+ if !acct.Messages().Empty() && !force {
+ return errors.New("Refusing to remove non-empty directory; use -f")
+ }
+
+ curDir := acct.SelectedDirectory()
+ var newDir string
+ dirFound := false
+
+ if oldDir, ok := history[acct.Name()]; ok {
+ if oldDir != curDir {
+ newDir = oldDir
+ dirFound = true
+ }
+ }
+
+ if !dirFound {
+ for _, dir := range acct.Directories().List() {
+ if dir != curDir {
+ newDir = dir
+ dirFound = true
+ break
+ }
+ }
+ }
+
+ if !dirFound {
+ return errors.New("No directory to move to afterwards!")
+ }
+
+ acct.Directories().Select(newDir)
+
+ acct.Worker().PostAction(&types.RemoveDirectory{
+ Directory: curDir,
+ }, func(msg types.WorkerMessage) {
+ switch msg := msg.(type) {
+ case *types.Done:
+ aerc.PushStatus("Directory removed.", 10*time.Second)
+ case *types.Error:
+ aerc.PushError(" " + msg.Error.Error())
+ case *types.Unsupported:
+ aerc.PushError(":rmdir is not supported by the backend.")
+ }
+ })
+
+ return nil
+}