diff options
Diffstat (limited to 'commands')
-rw-r--r-- | commands/account/rmdir.go | 96 |
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 +} |