diff --git a/cmd/list.go b/cmd/list.go index 32002be..7c1be1a 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -1,6 +1,7 @@ package cmd import ( + "encoding/json" "fmt" "os" "text/tabwriter" @@ -14,15 +15,25 @@ var List = &cli.Command{ Name: "list", Usage: "List templates in the registry", Description: "List all usable templates currently downloaded in the registry", - Action: runList, + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "json", + Usage: "JSON format", + }, + }, + Action: runList, } -func runList(_ *cli.Context) error { +func runList(ctx *cli.Context) error { reg, err := registry.Open(registryFlag) if err != nil { return err } + if ctx.Bool("json") { + return json.NewEncoder(os.Stdout).Encode(reg.Templates) + } + wr := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0) if _, err := fmt.Fprintf(wr, "NAME\tURL\tLOCAL\tLAST UPDATED\n"); err != nil { return err diff --git a/cmd/source.go b/cmd/source.go index 1a5f820..70f2adb 100644 --- a/cmd/source.go +++ b/cmd/source.go @@ -1,6 +1,7 @@ package cmd import ( + "encoding/json" "fmt" "os" "text/tabwriter" @@ -28,7 +29,13 @@ var ( Name: "list", Usage: "List available sources", Description: "List all available sources in the registry", - Action: runSourceList, + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "json", + Usage: "JSON format", + }, + }, + Action: runSourceList, } SourceAdd = &cli.Command{ @@ -48,12 +55,16 @@ var ( } ) -func runSourceList(_ *cli.Context) error { +func runSourceList(ctx *cli.Context) error { reg, err := registry.Open(registryFlag) if err != nil { return err } + if ctx.Bool("json") { + return json.NewEncoder(os.Stdout).Encode(reg.Sources) + } + wr := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', 0) if _, err := fmt.Fprintf(wr, "NAME\tURL\n"); err != nil { return err diff --git a/contrib/tmpl-completions.nu b/contrib/tmpl-completions.nu new file mode 100644 index 0000000..ca99993 --- /dev/null +++ b/contrib/tmpl-completions.nu @@ -0,0 +1,113 @@ +def _tmpl_env_keys [] { + ["TMPL_SOURCE", "TMPL_REGISTRY", "TMPL_BRANCH"] +} + +def _tmpl_source_list [] { + ^tmpl source list --json | from json | each { |it| { value: $it.Name, description: $it.URL } } +} + +def _tmpl_template_list [] { + ^tmpl list --json | from json | each { |it| { value: $it.Name, description: (if $it.Path != "" { $it.Path } else { $"($it.Repository)@($it.Branch)" }) } } +} + + +# Template automation +export extern "tmpl" [ + --registry(-r): string # Registry directory of tmpl (default: ~/.tmpl) [$TMPL_REGISTRY] + --source(-s): string # Short-name source to use [$TMPL_SOURCE] + --help(-h): bool # Show help + --version(-v): bool # Show version +] + +# Download a template +export extern "tmpl download" [ + repo_url: string # Repository URL + name: string # Local name for template + --branch(-b): string # Branch to clone (default: "main") [$TMPL_BRANCH] + --help(-h): bool # Show help +] + +# Manage tmpl environment variables +export extern "tmpl env" [ + --help(-h): bool # Show help +] + +# Set a tmpl environment variable +export extern "tmpl env set" [ + key: string@"_tmpl_env_keys" # Env key + value: string # Env value + --help(-h): bool # Show help +] + +# Unset a tmpl environment variable +export extern "tmpl env unset" [ + key: string@"_tmpl_env_keys" # Env key +] + +# Initialize a blank tmpl template +export extern "tmpl init" [ + --help(-h): bool # Show help +] + +# List all templates in registry +export extern "tmpl list" [ + --json: bool # Output in JSON + --help(-h): bool # Show help +] + +# Remove a template +export extern "tmpl remove" [ + name: string # Name of the template to remove + --help(-h): bool #Show help +] + +# Restore templates present in the registry, but missing archives +export extern "tmpl restore" [ + --help(-h): # Show help +] + +# Save a local template +export extern "tmpl save" [ + path: string # Path to the local template + name: string # Name of the template + --help(-h): bool # Show help +] + +# Work with tmpl sources +export extern "tmpl source" [ + --help(-h): # Show help +] + +# Add a tmpl source +export extern "tmpl source add" [ + base_url: string # Base URL + name: string # Name + --help(-h): bool # Show help +] + +# Remove a tmpl source +export extern "tmpl source remove" [ + name: string@"_tmpl_source_list" # Source to remove + --help(-h): bool # Show help +] + +# Test whether a directory is a valid tmpl template +export extern "tmpl test" [ + path?: string # Path to test (default: ".") + --help(-h): bool # Show help +] + +# Update a template +export extern "tmpl update" [ + name: string@"_tmpl_template_list" # Template to update + --help(-h): # Show help +] + +# Use a template +export extern "tmpl use" [ + name: string@"_tmpl_template_list" # The template to execute + dest?: path # Destination for the template (default: ".") + --defaults: bool # Use template defaults + --force: bool # Overwrite existing files + --help(-h): bool # Show help +]