diff --git a/cli/cliui/table.go b/cli/cliui/table.go index a747aff625495..90ecd0bb9211e 100644 --- a/cli/cliui/table.go +++ b/cli/cliui/table.go @@ -90,7 +90,7 @@ func DisplayTable(out any, sort string, filterColumns []string) (string, error) sort = strings.ToLower(strings.ReplaceAll(sort, "_", " ")) h, ok := headersMap[sort] if !ok { - return "", xerrors.Errorf("specified sort column %q not found in table headers, available columns are %q", sort, strings.Join(headersRaw, `", "`)) + return "", xerrors.Errorf(`specified sort column %q not found in table headers, available columns are "%v"`, sort, strings.Join(headersRaw, `", "`)) } // Autocorrect @@ -101,7 +101,7 @@ func DisplayTable(out any, sort string, filterColumns []string) (string, error) column := strings.ToLower(strings.ReplaceAll(column, "_", " ")) h, ok := headersMap[column] if !ok { - return "", xerrors.Errorf("specified filter column %q not found in table headers, available columns are %q", sort, strings.Join(headersRaw, `", "`)) + return "", xerrors.Errorf(`specified filter column %q not found in table headers, available columns are "%v"`, sort, strings.Join(headersRaw, `", "`)) } // Autocorrect @@ -158,6 +158,10 @@ func DisplayTable(out any, sort string, filterColumns []string) (string, error) if val != nil { v = val.Format(time.Stamp) } + case fmt.Stringer: + if val != nil { + v = val.String() + } } rowSlice[i] = v @@ -301,19 +305,3 @@ func valueToTableMap(val reflect.Value) (map[string]any, error) { return row, nil } - -func ValidateColumns(all, given []string) error { - for _, col := range given { - found := false - for _, c := range all { - if strings.EqualFold(strings.ReplaceAll(col, "_", " "), c) { - found = true - break - } - } - if !found { - return fmt.Errorf("unknown column: %s", col) - } - } - return nil -} diff --git a/cli/cliui/table_test.go b/cli/cliui/table_test.go index 1c1fc184a0e07..94ef20de0c993 100644 --- a/cli/cliui/table_test.go +++ b/cli/cliui/table_test.go @@ -1,6 +1,7 @@ package cliui_test import ( + "fmt" "log" "strings" "testing" @@ -12,6 +13,16 @@ import ( "github.com/coder/coder/cli/cliui" ) +type stringWrapper struct { + str string +} + +var _ fmt.Stringer = stringWrapper{} + +func (s stringWrapper) String() string { + return s.str +} + type tableTest1 struct { Name string `table:"name"` NotIncluded string // no table tag @@ -28,9 +39,9 @@ type tableTest1 struct { } type tableTest2 struct { - Name string `table:"name"` - Age int `table:"age"` - NotIncluded string `table:"-"` + Name stringWrapper `table:"name"` + Age int `table:"age"` + NotIncluded string `table:"-"` } type tableTest3 struct { @@ -48,21 +59,21 @@ func Test_DisplayTable(t *testing.T) { Age: 10, Roles: []string{"a", "b", "c"}, Sub1: tableTest2{ - Name: "foo1", + Name: stringWrapper{str: "foo1"}, Age: 11, }, Sub2: &tableTest2{ - Name: "foo2", + Name: stringWrapper{str: "foo2"}, Age: 12, }, Sub3: tableTest3{ Sub: tableTest2{ - Name: "foo3", + Name: stringWrapper{str: "foo3"}, Age: 13, }, }, Sub4: tableTest2{ - Name: "foo4", + Name: stringWrapper{str: "foo4"}, Age: 14, }, Time: someTime, @@ -73,18 +84,18 @@ func Test_DisplayTable(t *testing.T) { Age: 20, Roles: []string{"a"}, Sub1: tableTest2{ - Name: "bar1", + Name: stringWrapper{str: "bar1"}, Age: 21, }, Sub2: nil, Sub3: tableTest3{ Sub: tableTest2{ - Name: "bar3", + Name: stringWrapper{str: "bar3"}, Age: 23, }, }, Sub4: tableTest2{ - Name: "bar4", + Name: stringWrapper{str: "bar4"}, Age: 24, }, Time: someTime, @@ -95,18 +106,18 @@ func Test_DisplayTable(t *testing.T) { Age: 30, Roles: nil, Sub1: tableTest2{ - Name: "baz1", + Name: stringWrapper{str: "baz1"}, Age: 31, }, Sub2: nil, Sub3: tableTest3{ Sub: tableTest2{ - Name: "baz3", + Name: stringWrapper{str: "baz3"}, Age: 33, }, }, Sub4: tableTest2{ - Name: "baz4", + Name: stringWrapper{str: "baz4"}, Age: 34, }, Time: someTime, diff --git a/cli/features.go b/cli/features.go index 307404d5c83c6..d7f0fbdee1056 100644 --- a/cli/features.go +++ b/cli/features.go @@ -5,12 +5,10 @@ import ( "fmt" "strings" - "github.com/coder/coder/cli/cliui" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" "golang.org/x/xerrors" + "github.com/coder/coder/cli/cliui" "github.com/coder/coder/codersdk" ) @@ -38,10 +36,6 @@ func featuresList() *cobra.Command { Use: "list", Aliases: []string{"ls"}, RunE: func(cmd *cobra.Command, args []string) error { - err := cliui.ValidateColumns(featureColumns, columns) - if err != nil { - return err - } client, err := createClient(cmd) if err != nil { return err @@ -54,11 +48,14 @@ func featuresList() *cobra.Command { out := "" switch outputFormat { case "table", "": - out = displayFeatures(columns, entitlements.Features) + out, err = displayFeatures(columns, entitlements.Features) + if err != nil { + return xerrors.Errorf("render table: %w", err) + } case "json": outBytes, err := json.Marshal(entitlements) if err != nil { - return xerrors.Errorf("marshal users to JSON: %w", err) + return xerrors.Errorf("marshal features to JSON: %w", err) } out = string(outBytes) @@ -78,35 +75,28 @@ func featuresList() *cobra.Command { return cmd } +type featureRow struct { + Name string `table:"name"` + Entitlement string `table:"entitlement"` + Enabled bool `table:"enabled"` + Limit *int64 `table:"limit"` + Actual *int64 `table:"actual"` +} + // displayFeatures will return a table displaying all features passed in. // filterColumns must be a subset of the feature fields and will determine which // columns to display -func displayFeatures(filterColumns []string, features map[string]codersdk.Feature) string { - tableWriter := cliui.Table() - header := table.Row{} - for _, h := range featureColumns { - header = append(header, h) - } - tableWriter.AppendHeader(header) - tableWriter.SetColumnConfigs(cliui.FilterTableColumns(header, filterColumns)) - tableWriter.SortBy([]table.SortBy{{ - Name: "username", - }}) +func displayFeatures(filterColumns []string, features map[string]codersdk.Feature) (string, error) { + rows := make([]featureRow, 0, len(features)) for name, feat := range features { - tableWriter.AppendRow(table.Row{ - name, - feat.Entitlement, - feat.Enabled, - intOrNil(feat.Limit), - intOrNil(feat.Actual), + rows = append(rows, featureRow{ + Name: name, + Entitlement: string(feat.Entitlement), + Enabled: feat.Enabled, + Limit: feat.Limit, + Actual: feat.Actual, }) } - return tableWriter.Render() -} -func intOrNil(i *int64) string { - if i == nil { - return "" - } - return fmt.Sprintf("%d", *i) + return cliui.DisplayTable(rows, "name", filterColumns) } diff --git a/cli/list.go b/cli/list.go index 11c39362781fb..4ecc7737d4a68 100644 --- a/cli/list.go +++ b/cli/list.go @@ -5,7 +5,6 @@ import ( "time" "github.com/google/uuid" - "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" "github.com/coder/coder/cli/cliui" @@ -14,6 +13,49 @@ import ( "github.com/coder/coder/codersdk" ) +type workspaceListRow struct { + Workspace string `table:"workspace"` + Template string `table:"template"` + Status string `table:"status"` + LastBuilt string `table:"last built"` + Outdated bool `table:"outdated"` + StartsAt string `table:"starts at"` + StopsAfter string `table:"stops after"` +} + +func workspaceListRowFromWorkspace(now time.Time, usersByID map[uuid.UUID]codersdk.User, workspace codersdk.Workspace) workspaceListRow { + status := codersdk.WorkspaceDisplayStatus(workspace.LatestBuild.Job.Status, workspace.LatestBuild.Transition) + + lastBuilt := now.UTC().Sub(workspace.LatestBuild.Job.CreatedAt).Truncate(time.Second) + autostartDisplay := "-" + if !ptr.NilOrEmpty(workspace.AutostartSchedule) { + if sched, err := schedule.Weekly(*workspace.AutostartSchedule); err == nil { + autostartDisplay = fmt.Sprintf("%s %s (%s)", sched.Time(), sched.DaysOfWeek(), sched.Location()) + } + } + + autostopDisplay := "-" + if !ptr.NilOrZero(workspace.TTLMillis) { + dur := time.Duration(*workspace.TTLMillis) * time.Millisecond + autostopDisplay = durationDisplay(dur) + if !workspace.LatestBuild.Deadline.IsZero() && workspace.LatestBuild.Deadline.After(now) && status == "Running" { + remaining := time.Until(workspace.LatestBuild.Deadline) + autostopDisplay = fmt.Sprintf("%s (%s)", autostopDisplay, relative(remaining)) + } + } + + user := usersByID[workspace.OwnerID] + return workspaceListRow{ + Workspace: user.Username + "/" + workspace.Name, + Template: workspace.TemplateName, + Status: status, + LastBuilt: durationDisplay(lastBuilt), + Outdated: workspace.Outdated, + StartsAt: autostartDisplay, + StopsAfter: autostopDisplay, + } +} + func list() *cobra.Command { var columns []string cmd := &cobra.Command{ @@ -32,10 +74,10 @@ func list() *cobra.Command { return err } if len(workspaces) == 0 { - _, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Prompt.String()+"No workspaces found! Create one:") - _, _ = fmt.Fprintln(cmd.OutOrStdout()) - _, _ = fmt.Fprintln(cmd.OutOrStdout(), " "+cliui.Styles.Code.Render("coder create ")) - _, _ = fmt.Fprintln(cmd.OutOrStdout()) + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), cliui.Styles.Prompt.String()+"No workspaces found! Create one:") + _, _ = fmt.Fprintln(cmd.ErrOrStderr()) + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), " "+cliui.Styles.Code.Render("coder create ")) + _, _ = fmt.Fprintln(cmd.ErrOrStderr()) return nil } users, err := client.Users(cmd.Context(), codersdk.UsersRequest{}) @@ -47,48 +89,18 @@ func list() *cobra.Command { usersByID[user.ID] = user } - tableWriter := cliui.Table() - header := table.Row{"workspace", "template", "status", "last built", "outdated", "starts at", "stops after"} - tableWriter.AppendHeader(header) - tableWriter.SortBy([]table.SortBy{{ - Name: "workspace", - }}) - tableWriter.SetColumnConfigs(cliui.FilterTableColumns(header, columns)) - now := time.Now() - for _, workspace := range workspaces { - status := codersdk.WorkspaceDisplayStatus(workspace.LatestBuild.Job.Status, workspace.LatestBuild.Transition) - - lastBuilt := time.Now().UTC().Sub(workspace.LatestBuild.Job.CreatedAt).Truncate(time.Second) - autostartDisplay := "-" - if !ptr.NilOrEmpty(workspace.AutostartSchedule) { - if sched, err := schedule.Weekly(*workspace.AutostartSchedule); err == nil { - autostartDisplay = fmt.Sprintf("%s %s (%s)", sched.Time(), sched.DaysOfWeek(), sched.Location()) - } - } - - autostopDisplay := "-" - if !ptr.NilOrZero(workspace.TTLMillis) { - dur := time.Duration(*workspace.TTLMillis) * time.Millisecond - autostopDisplay = durationDisplay(dur) - if !workspace.LatestBuild.Deadline.IsZero() && workspace.LatestBuild.Deadline.After(now) && status == "Running" { - remaining := time.Until(workspace.LatestBuild.Deadline) - autostopDisplay = fmt.Sprintf("%s (%s)", autostopDisplay, relative(remaining)) - } - } + displayWorkspaces := make([]workspaceListRow, len(workspaces)) + for i, workspace := range workspaces { + displayWorkspaces[i] = workspaceListRowFromWorkspace(now, usersByID, workspace) + } - user := usersByID[workspace.OwnerID] - tableWriter.AppendRow(table.Row{ - user.Username + "/" + workspace.Name, - workspace.TemplateName, - status, - durationDisplay(lastBuilt), - workspace.Outdated, - autostartDisplay, - autostopDisplay, - }) + out, err := cliui.DisplayTable(displayWorkspaces, "workspace", columns) + if err != nil { + return err } - _, err = fmt.Fprintln(cmd.OutOrStdout(), tableWriter.Render()) + + _, err = fmt.Fprintln(cmd.OutOrStdout(), out) return err }, } diff --git a/cli/parameters.go b/cli/parameters.go index 5d69cb51d33e8..3f02ea989e6ee 100644 --- a/cli/parameters.go +++ b/cli/parameters.go @@ -1,11 +1,7 @@ package cli import ( - "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" - - "github.com/coder/coder/cli/cliui" - "github.com/coder/coder/codersdk" ) func parameters() *cobra.Command { @@ -30,29 +26,3 @@ func parameters() *cobra.Command { ) return cmd } - -// displayParameters will return a table displaying all parameters passed in. -// filterColumns must be a subset of the parameter fields and will determine which -// columns to display -func displayParameters(filterColumns []string, params ...codersdk.Parameter) string { - tableWriter := cliui.Table() - header := table.Row{"id", "scope", "scope id", "name", "source scheme", "destination scheme", "created at", "updated at"} - tableWriter.AppendHeader(header) - tableWriter.SetColumnConfigs(cliui.FilterTableColumns(header, filterColumns)) - tableWriter.SortBy([]table.SortBy{{ - Name: "name", - }}) - for _, param := range params { - tableWriter.AppendRow(table.Row{ - param.ID.String(), - param.Scope, - param.ScopeID.String(), - param.Name, - param.SourceScheme, - param.DestinationScheme, - param.CreatedAt, - param.UpdatedAt, - }) - } - return tableWriter.Render() -} diff --git a/cli/parameterslist.go b/cli/parameterslist.go index 64d250eb5ffdd..b9c675b4cfe5e 100644 --- a/cli/parameterslist.go +++ b/cli/parameterslist.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/xerrors" + "github.com/coder/coder/cli/cliui" "github.com/coder/coder/codersdk" ) @@ -70,11 +71,16 @@ func parameterList() *cobra.Command { return xerrors.Errorf("fetch params: %w", err) } - _, err = fmt.Fprintln(cmd.OutOrStdout(), displayParameters(columns, params...)) + out, err := cliui.DisplayTable(params, "name", columns) + if err != nil { + return xerrors.Errorf("render table: %w", err) + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), out) return err }, } - cmd.Flags().StringArrayVarP(&columns, "column", "c", []string{"name", "scope", "destination_scheme"}, + cmd.Flags().StringArrayVarP(&columns, "column", "c", []string{"name", "scope", "destination scheme"}, "Specify a column to filter in the table.") return cmd } diff --git a/cli/templatelist.go b/cli/templatelist.go index 4691b8a94ebfc..2350f44086102 100644 --- a/cli/templatelist.go +++ b/cli/templatelist.go @@ -30,12 +30,17 @@ func templateList() *cobra.Command { } if len(templates) == 0 { - _, _ = fmt.Fprintf(cmd.OutOrStdout(), "%s No templates found in %s! Create one:\n\n", caret, color.HiWhiteString(organization.Name)) - _, _ = fmt.Fprintln(cmd.OutOrStdout(), color.HiMagentaString(" $ coder templates create \n")) + _, _ = fmt.Fprintf(cmd.ErrOrStderr(), "%s No templates found in %s! Create one:\n\n", caret, color.HiWhiteString(organization.Name)) + _, _ = fmt.Fprintln(cmd.ErrOrStderr(), color.HiMagentaString(" $ coder templates create \n")) return nil } - _, err = fmt.Fprintln(cmd.OutOrStdout(), displayTemplates(columns, templates...)) + out, err := displayTemplates(columns, templates...) + if err != nil { + return err + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), out) return err }, } diff --git a/cli/templatelist_test.go b/cli/templatelist_test.go index 3324604d6abe0..8045926571654 100644 --- a/cli/templatelist_test.go +++ b/cli/templatelist_test.go @@ -57,7 +57,7 @@ func TestTemplateList(t *testing.T) { pty := ptytest.New(t) cmd.SetIn(pty.Input()) - cmd.SetOut(pty.Output()) + cmd.SetErr(pty.Output()) errC := make(chan error) go func() { diff --git a/cli/templates.go b/cli/templates.go index 43a4ad25271ac..ce8d7247b3edd 100644 --- a/cli/templates.go +++ b/cli/templates.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/jedib0t/go-pretty/v6/table" + "github.com/google/uuid" "github.com/spf13/cobra" "github.com/coder/coder/cli/cliui" @@ -46,35 +46,41 @@ func templates() *cobra.Command { return cmd } +type templateTableRow struct { + Name string `table:"name"` + CreatedAt string `table:"created at"` + LastUpdated string `table:"last updated"` + OrganizationID uuid.UUID `table:"organization id"` + Provisioner codersdk.ProvisionerType `table:"provisioner"` + ActiveVersionID uuid.UUID `table:"active version id"` + UsedBy string `table:"used by"` + MaxTTL time.Duration `table:"max ttl"` + MinAutostartInterval time.Duration `table:"min autostart"` +} + // displayTemplates will return a table displaying all templates passed in. // filterColumns must be a subset of the template fields and will determine which // columns to display -func displayTemplates(filterColumns []string, templates ...codersdk.Template) string { - tableWriter := cliui.Table() - header := table.Row{ - "Name", "Created At", "Last Updated", "Organization ID", "Provisioner", - "Active Version ID", "Used By", "Max TTL", "Min Autostart"} - tableWriter.AppendHeader(header) - tableWriter.SetColumnConfigs(cliui.FilterTableColumns(header, filterColumns)) - tableWriter.SortBy([]table.SortBy{{ - Name: "name", - }}) - for _, template := range templates { +func displayTemplates(filterColumns []string, templates ...codersdk.Template) (string, error) { + rows := make([]templateTableRow, len(templates)) + for i, template := range templates { suffix := "" if template.WorkspaceOwnerCount != 1 { suffix = "s" } - tableWriter.AppendRow(table.Row{ - template.Name, - template.CreatedAt.Format("January 2, 2006"), - template.UpdatedAt.Format("January 2, 2006"), - template.OrganizationID.String(), - template.Provisioner, - template.ActiveVersionID.String(), - cliui.Styles.Fuchsia.Render(fmt.Sprintf("%d developer%s", template.WorkspaceOwnerCount, suffix)), - (time.Duration(template.MaxTTLMillis) * time.Millisecond).String(), - (time.Duration(template.MinAutostartIntervalMillis) * time.Millisecond).String(), - }) + + rows[i] = templateTableRow{ + Name: template.Name, + CreatedAt: template.CreatedAt.Format("January 2, 2006"), + LastUpdated: template.UpdatedAt.Format("January 2, 2006"), + OrganizationID: template.OrganizationID, + Provisioner: template.Provisioner, + ActiveVersionID: template.ActiveVersionID, + UsedBy: cliui.Styles.Fuchsia.Render(fmt.Sprintf("%d developer%s", template.WorkspaceOwnerCount, suffix)), + MaxTTL: (time.Duration(template.MaxTTLMillis) * time.Millisecond), + MinAutostartInterval: (time.Duration(template.MinAutostartIntervalMillis) * time.Millisecond), + } } - return tableWriter.Render() + + return cliui.DisplayTable(rows, "name", filterColumns) } diff --git a/cli/templateversions.go b/cli/templateversions.go index 2d5844d685e39..8dcb51bd957ff 100644 --- a/cli/templateversions.go +++ b/cli/templateversions.go @@ -3,9 +3,9 @@ package cli import ( "fmt" "strings" + "time" "github.com/google/uuid" - "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" "golang.org/x/xerrors" @@ -58,31 +58,44 @@ func templateVersionsList() *cobra.Command { if err != nil { return xerrors.Errorf("get template versions by template: %w", err) } - _, err = fmt.Fprintln(cmd.OutOrStdout(), displayTemplateVersions(template.ActiveVersionID, versions...)) + + out, err := displayTemplateVersions(template.ActiveVersionID, versions...) + if err != nil { + return xerrors.Errorf("render table: %w", err) + } + + _, err = fmt.Fprintln(cmd.OutOrStdout(), out) return err }, } } +type templateVersionRow struct { + Name string `table:"name"` + CreatedAt time.Time `table:"created at"` + CreatedBy string `table:"created by"` + Status string `table:"status"` + Active string `table:"active"` +} + // displayTemplateVersions will return a table displaying existing // template versions for the specified template. -func displayTemplateVersions(activeVersionID uuid.UUID, templateVersions ...codersdk.TemplateVersion) string { - tableWriter := cliui.Table() - header := table.Row{ - "Name", "Created At", "Created By", "Status", ""} - tableWriter.AppendHeader(header) - for _, templateVersion := range templateVersions { +func displayTemplateVersions(activeVersionID uuid.UUID, templateVersions ...codersdk.TemplateVersion) (string, error) { + rows := make([]templateVersionRow, len(templateVersions)) + for i, templateVersion := range templateVersions { var activeStatus = "" if templateVersion.ID == activeVersionID { activeStatus = cliui.Styles.Code.Render(cliui.Styles.Keyword.Render("Active")) } - tableWriter.AppendRow(table.Row{ - templateVersion.Name, - templateVersion.CreatedAt.Format("03:04:05 PM MST on Jan 2, 2006"), - templateVersion.CreatedByName, - strings.Title(string(templateVersion.Job.Status)), - activeStatus, - }) + + rows[i] = templateVersionRow{ + Name: templateVersion.Name, + CreatedAt: templateVersion.CreatedAt, + CreatedBy: templateVersion.CreatedByName, + Status: strings.Title(string(templateVersion.Job.Status)), + Active: activeStatus, + } } - return tableWriter.Render() + + return cliui.DisplayTable(rows, "name", nil) } diff --git a/cli/userlist.go b/cli/userlist.go index 1d4a86daa49e5..a3e0c6a9f36c6 100644 --- a/cli/userlist.go +++ b/cli/userlist.go @@ -111,13 +111,13 @@ func userSingle() *cobra.Command { } func displayUser(ctx context.Context, stderr io.Writer, client *codersdk.Client, user codersdk.User) string { - tableWriter := cliui.Table() + tw := cliui.Table() addRow := func(name string, value interface{}) { key := "" if name != "" { key = name + ":" } - tableWriter.AppendRow(table.Row{ + tw.AppendRow(table.Row{ key, value, }) } @@ -170,5 +170,5 @@ func displayUser(ctx context.Context, stderr io.Writer, client *codersdk.Client, addRow("Organizations", "(none)") } - return tableWriter.Render() + return tw.Render() } diff --git a/codersdk/parameters.go b/codersdk/parameters.go index c6cd217c5f204..a26bcdb27f6c9 100644 --- a/codersdk/parameters.go +++ b/codersdk/parameters.go @@ -50,14 +50,14 @@ type ComputedParameter struct { // Parameter represents a set value for the scope. type Parameter struct { - ID uuid.UUID `json:"id"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - Scope ParameterScope `json:"scope"` - ScopeID uuid.UUID `json:"scope_id"` - Name string `json:"name"` - SourceScheme ParameterSourceScheme `json:"source_scheme"` - DestinationScheme ParameterDestinationScheme `json:"destination_scheme"` + ID uuid.UUID `json:"id" table:"id"` + Scope ParameterScope `json:"scope" table:"scope"` + ScopeID uuid.UUID `json:"scope_id" table:"scope id"` + Name string `json:"name" table:"name"` + SourceScheme ParameterSourceScheme `json:"source_scheme" table:"source scheme"` + DestinationScheme ParameterDestinationScheme `json:"destination_scheme" table:"destination scheme"` + CreatedAt time.Time `json:"created_at" table:"created at"` + UpdatedAt time.Time `json:"updated_at" table:"updated at"` } type ParameterSchema struct { diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 377f2d9157969..929f6c00232d6 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -205,13 +205,13 @@ export interface Pagination { // From codersdk/parameters.go export interface Parameter { readonly id: string - readonly created_at: string - readonly updated_at: string readonly scope: ParameterScope readonly scope_id: string readonly name: string readonly source_scheme: ParameterSourceScheme readonly destination_scheme: ParameterDestinationScheme + readonly created_at: string + readonly updated_at: string } // From codersdk/parameters.go pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy