From 0f4620607a543717dbb9946bf979c82b0c557db6 Mon Sep 17 00:00:00 2001 From: lalyos Date: Sat, 14 Dec 2024 22:46:12 +0100 Subject: [PATCH] add playground catalog command --- cmd/playground/catalog.go | 90 ++++++++++++++++++++++++++++++++++++ cmd/playground/playground.go | 1 + cmd/playground/start.go | 2 +- internal/api/playgrounds.go | 10 +++- 4 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 cmd/playground/catalog.go diff --git a/cmd/playground/catalog.go b/cmd/playground/catalog.go new file mode 100644 index 0000000..ff74ece --- /dev/null +++ b/cmd/playground/catalog.go @@ -0,0 +1,90 @@ +package playground + +import ( + "cmp" + "context" + "fmt" + "slices" + + "github.com/spf13/cobra" + + "github.com/iximiuz/labctl/internal/api" + "github.com/iximiuz/labctl/internal/labcli" +) + +type catalogOptions struct { + filter string + quiet bool +} + +func newCatalogCommand(cli labcli.CLI) *cobra.Command { + var opts catalogOptions + + cmd := &cobra.Command{ + Use: "catalog", + Aliases: []string{"cat"}, + Short: `List catalog`, + RunE: func(cmd *cobra.Command, args []string) error { + return labcli.WrapStatusError(runListCatalogs(cmd.Context(), cli, &opts)) + }, + } + flags := cmd.Flags() + + flags.BoolVarP( + &opts.quiet, + "quiet", + "q", + false, + `Only print playground IDs`, + ) + + flags.StringVarP( + &opts.filter, + "filter", + "f", + "", + `Filter to use for catalog list. ("recent" | "popular" | "my-custom") (default "")`, + ) + return cmd +} + +func runListCatalogs(ctx context.Context, cli labcli.CLI, opts *catalogOptions) error { + + var catalog []api.Playground + var err error + + // once the backend is fixed there is no need for this if + if opts.filter != "" { + catalog, err = cli.Client().ListPlaygrounds(ctx, opts.filter) + if err != nil { + return fmt.Errorf("couldn't list catalog: %w", err) + } + } else { + catalog, err = cli.Client().ListPlaygrounds(ctx, "") + if err != nil { + return fmt.Errorf("couldn't list catalog: %w", err) + } + customs, err := cli.Client().ListPlaygrounds(ctx, "my-custom") + if err != nil { + return fmt.Errorf("couldn't list catalog: %w", err) + } + catalog = append(catalog, customs...) + } + + slices.SortFunc(catalog, func(a, b api.Playground) int { return cmp.Compare(a.Name, b.Name) }) + + fmt.Fprintln(cli.OutputStream(), "Available playgrounds:") + if opts.quiet { + for _, p := range catalog { + fmt.Fprintln(cli.OutputStream(), p.Name) + } + + } else { + for _, p := range catalog { + //fmt.Fprintf(cli.OutputStream(), "%-30v %-30v\n", p.Name, p.Title) + fmt.Fprintf(cli.OutputStream(), " - %s - %s\n", p.Name, p.Description) + } + } + + return nil +} diff --git a/cmd/playground/playground.go b/cmd/playground/playground.go index 0dc2075..588208f 100644 --- a/cmd/playground/playground.go +++ b/cmd/playground/playground.go @@ -15,6 +15,7 @@ func NewCommand(cli labcli.CLI) *cobra.Command { cmd.AddCommand( newListCommand(cli), + newCatalogCommand(cli), newStartCommand(cli), newStopCommand(cli), newMachinesCommand(cli), diff --git a/cmd/playground/start.go b/cmd/playground/start.go index d342077..ccddf96 100644 --- a/cmd/playground/start.go +++ b/cmd/playground/start.go @@ -208,7 +208,7 @@ func runStartPlayground(ctx context.Context, cli labcli.CLI, opts *startOptions) } func listKnownPlaygrounds(ctx context.Context, cli labcli.CLI) string { - playgrounds, err := cli.Client().ListPlaygrounds(ctx) + playgrounds, err := cli.Client().ListPlaygrounds(ctx, "") if err != nil { cli.PrintErr("Couldn't list known playgrounds: %v\n", err) return "" diff --git a/internal/api/playgrounds.go b/internal/api/playgrounds.go index 27b95a0..ad15868 100644 --- a/internal/api/playgrounds.go +++ b/internal/api/playgrounds.go @@ -2,6 +2,7 @@ package api import ( "context" + "net/url" ) type Playground struct { @@ -26,9 +27,14 @@ func (c *Client) GetPlayground(ctx context.Context, name string) (*Playground, e return &p, c.GetInto(ctx, "/playgrounds/"+name, nil, nil, &p) } -func (c *Client) ListPlaygrounds(ctx context.Context) ([]Playground, error) { +func (c *Client) ListPlaygrounds(ctx context.Context, filter string) ([]Playground, error) { var plays []Playground - return plays, c.GetInto(ctx, "/playgrounds", nil, nil, &plays) + + q := url.Values{} + if filter != "" { + q.Add("filter", filter) + } + return plays, c.GetInto(ctx, "/playgrounds", q, nil, &plays) } type MachineUser struct {