about summary refs log tree commit diff stats
path: root/commands
diff options
context:
space:
mode:
Diffstat (limited to 'commands')
-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
+}