refactor: clean up nidusctl CLI

This commit is contained in:
2026-08-30 19:54:34 +02:00
parent 9b9cbe2f6f
commit 2e43e32a9f
3 changed files with 106 additions and 115 deletions
+44 -57
View File
@@ -8,7 +8,6 @@
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
@@ -23,18 +22,12 @@ func main() {
}
func run(args []string) int {
fs := flag.NewFlagSet("nidusctl", flag.ContinueOnError)
cfgPath := fs.String("config", "config.yaml", "path to configuration file")
if err := fs.Parse(args); err != nil {
return 2
}
rest := fs.Args()
if len(rest) < 1 {
if len(args) < 1 {
usage()
return 2
}
cfg, err := config.Load(*cfgPath)
cfg, err := config.Load()
if err != nil {
fmt.Fprintf(os.Stderr, "error loading config: %v\n", err)
return 1
@@ -54,20 +47,20 @@ func run(args []string) int {
return 1
}
switch rest[0] {
switch args[0] {
case "user":
return runUser(dbase, rest[1:])
return runUser(dbase, args[1:])
case "calendar", "cal":
return runCalendar(dbase, st, rest[1:])
return runCalendar(dbase, st, args[1:])
case "addressbook", "card":
return runAddressBook(dbase, st, rest[1:])
return runAddressBook(dbase, st, args[1:])
case "migrate":
return runMigrate(st, rest[1:])
return runMigrate(st, args[1:])
case "help", "-h", "--help":
usage()
return 0
default:
fmt.Fprintf(os.Stderr, "unknown command %q\n\n", rest[0])
fmt.Fprintf(os.Stderr, "unknown command: %s\n", args[0])
usage()
return 2
}
@@ -77,43 +70,41 @@ func usage() {
fmt.Fprint(os.Stderr, `nidusctl - manage nidus DAV server users, resources, and sharing grants
Usage:
nidusctl [-config config.yaml] user create <username> [--display-name NAME] [--email EMAIL] [--password PW]
nidusctl [-config config.yaml] user delete <username>
nidusctl [-config config.yaml] user list
nidusctl [-config config.yaml] user passwd <username> [--password PW]
nidusctl user create <username> [--display-name NAME] [--email EMAIL] [--password PW]
nidusctl user delete <username>
nidusctl user list
nidusctl user passwd <username> [--password PW]
nidusctl [-config config.yaml] calendar create <owner> <calendar> [--color '#RRGGBB']
nidusctl [-config config.yaml] calendar color <owner> <calendar> <hex-color>
nidusctl [-config config.yaml] calendar delete <owner> <calendar>
nidusctl [-config config.yaml] calendar list <owner>
nidusctl [-config config.yaml] calendar share <owner> <calendar> <user> <read|write>
nidusctl [-config config.yaml] calendar unshare <owner> <calendar> <user>
nidusctl [-config config.yaml] calendar shares <owner> <calendar>
nidusctl calendar create <owner> <calendar> [--color '#RRGGBB']
nidusctl calendar color <owner> <calendar> <hex-color>
nidusctl calendar delete <owner> <calendar>
nidusctl calendar list <owner>
nidusctl calendar share <owner> <calendar> <user> <read|write>
nidusctl calendar unshare <owner> <calendar> <user>
nidusctl calendar shares <owner> <calendar>
nidusctl [-config config.yaml] addressbook create <owner> <book>
nidusctl [-config config.yaml] addressbook delete <owner> <book>
nidusctl [-config config.yaml] addressbook list <owner>
nidusctl [-config config.yaml] addressbook share <owner> <book> <user> <read|write>
nidusctl [-config config.yaml] addressbook unshare <owner> <book> <user>
nidusctl [-config config.yaml] addressbook shares <owner> <book>
nidusctl addressbook create <owner> <book>
nidusctl addressbook delete <owner> <book>
nidusctl addressbook list <owner>
nidusctl addressbook share <owner> <book> <user> <read|write>
nidusctl addressbook unshare <owner> <book> <user>
nidusctl addressbook shares <owner> <book>
nidusctl [-config config.yaml] migrate [--verbose]
nidusctl migrate [--verbose]
nidusctl help
Configuration is done via environment variables:
NIDUS_DATA_DIR - data directory (default: ./data)
Examples:
nidusctl user create alice --display-name "Alice Smith" --email alice@example.com
nidusctl calendar create alice work
nidusctl calendar share alice work bob write
nidusctl calendar shares alice work
nidusctl calendar unshare alice work bob
nidusctl migrate
`)
}
// newFlagSet creates a flag.FlagSet configured for subcommand parsing
// (flags may appear before or after positional args, since callers parse
// flags first with fs.Parse then read fs.Args() for the rest).
func newFlagSet(name string) *flag.FlagSet {
return flag.NewFlagSet(name, flag.ContinueOnError)
nidusctl calendar share alice work bob write
nidusctl calendar shares alice work
nidusctl calendar unshare alice work bob
nidusctl migrate
`)
}
func runCalendar(dbase *db.DB, st *store.Store, args []string) int {
@@ -123,17 +114,17 @@ func runCalendar(dbase *db.DB, st *store.Store, args []string) int {
}
switch args[0] {
case "create":
fs := newFlagSet("calendar create")
color := fs.String("color", "", "hex color like #3b82f6 (optional)")
if err := fs.Parse(args[1:]); err != nil {
return 2
color := ""
if len(args) > 2 && args[1] == "--color" {
color = args[2]
args = args[:1]
}
if fs.NArg() != 2 {
if len(args) != 3 {
fmt.Fprintln(os.Stderr, "usage: nidusctl calendar create <owner> <calendar> [--color '#RRGGBB']")
return 2
}
owner, calName := fs.Arg(0), fs.Arg(1)
if err := dbase.CreateCalendarWithColor(owner, calName, *color); err != nil {
owner, calName := args[1], args[2]
if err := dbase.CreateCalendarWithColor(owner, calName, color); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
return 1
}
@@ -365,11 +356,7 @@ func runAddressBook(dbase *db.DB, st *store.Store, args []string) int {
}
func runMigrate(st *store.Store, args []string) int {
fs := newFlagSet("migrate")
if err := fs.Parse(args); err != nil {
return 2
}
// Ignore args for now (could add --verbose flag in future if needed)
if err := st.Migrate(); err != nil {
fmt.Fprintf(os.Stderr, "migration failed: %v\n", err)
return 1