refactor: clean up nidusctl CLI
This commit is contained in:
+44
-57
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user