Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 28 additions & 17 deletions cli/azd/cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -639,39 +639,50 @@ func (a *configOptionsAction) Run(ctx context.Context) (*actions.ActionResult, e
})
}

columns := []output.Column{
columns := []output.PrettyColumn{
{
Heading: "Key",
ValueTemplate: "{{.Key}}",
Column: output.Column{Heading: "KEY", ValueTemplate: "{{.Key}}"},
Priority: 1,
},
{
Heading: "Description",
ValueTemplate: "{{.Description}}",
Column: output.Column{Heading: "DESCRIPTION", ValueTemplate: "{{.Description}}"},
Priority: 1,
},
{
Heading: "Type",
ValueTemplate: "{{.Type}}",
Column: output.Column{Heading: "TYPE", ValueTemplate: "{{.Type}}"},
Priority: 2,
},
{
Heading: "Current Value",
ValueTemplate: "{{.CurrentValue}}",
Column: output.Column{
Heading: "CURRENT VALUE",
ValueTemplate: "{{.CurrentValue}}",
},
Priority: 2,
},
{
Heading: "Allowed Values",
ValueTemplate: "{{.AllowedValues}}",
Column: output.Column{
Heading: "ALLOWED VALUES",
ValueTemplate: "{{.AllowedValues}}",
},
Priority: 3,
},
{
Heading: "Environment Variable",
ValueTemplate: "{{.EnvVar}}",
Column: output.Column{
Heading: "ENVIRONMENT VARIABLE",
ValueTemplate: "{{.EnvVar}}",
},
Priority: 3,
},
{
Heading: "Example",
ValueTemplate: "{{.Example}}",
Column: output.Column{Heading: "EXAMPLE", ValueTemplate: "{{.Example}}"},
Priority: 3,
},
}

err = a.formatter.Format(rows, a.writer, output.TableFormatterOptions{
Columns: columns,
prettyFormatter := &output.PrettyTableFormatter{}
err = prettyFormatter.Format(rows, a.writer, output.PrettyTableFormatterOptions{
Columns: columns,
CardGroupColumn: "KEY",
})
if err != nil {
return nil, fmt.Errorf("failed formatting config options: %w", err)
Expand Down
4 changes: 2 additions & 2 deletions cli/azd/cmd/config_options_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ func TestConfigOptionsAction_Table(t *testing.T) {
require.NoError(t, err)

outputStr := buf.String()
require.Contains(t, outputStr, "Key")
require.Contains(t, outputStr, "Description")
require.Contains(t, outputStr, "KEY")
require.Contains(t, outputStr, "DESCRIPTION")
require.Contains(t, outputStr, "defaults.subscription")
require.Contains(t, outputStr, "alpha.all")
require.Contains(t, outputStr, "auth.useAzCliAuth")
Expand Down
83 changes: 56 additions & 27 deletions cli/azd/cmd/copilot.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,23 +288,34 @@ func (a *copilotConsentListAction) Run(ctx context.Context) (*actions.ActionResu

// Convert rules to display format
type ruleDisplay struct {
Target string `json:"target"`
Context string `json:"context"`
Action string `json:"action"`
Permission string `json:"permission"`
Scope string `json:"scope"`
GrantedAt string `json:"grantedAt"`
Target string `json:"target"`
Context string `json:"context"`
Action string `json:"action"`
Permission string `json:"permission"`
PermissionSymbol string `json:"-"`
Scope string `json:"scope"`
GrantedAt string `json:"grantedAt"`
}

var displayRules []ruleDisplay
for _, rule := range rules {
perm := string(rule.Permission)
symbol := "?"
switch perm {
case "allow":
symbol = "✓"
case "deny":
symbol = "✗"
}

displayRules = append(displayRules, ruleDisplay{
Target: string(rule.Target),
Context: string(rule.Operation),
Action: string(rule.Action),
Permission: string(rule.Permission),
Scope: string(rule.Scope),
GrantedAt: rule.GrantedAt.Format("2006-01-02 15:04:05"),
Target: string(rule.Target),
Context: string(rule.Operation),
Action: string(rule.Action),
Permission: perm,
PermissionSymbol: symbol,
Scope: string(rule.Scope),
GrantedAt: rule.GrantedAt.Format("2006-01-02 15:04:05"),
})
}

Expand All @@ -314,35 +325,39 @@ func (a *copilotConsentListAction) Run(ctx context.Context) (*actions.ActionResu

// Use table formatter for better output
if a.formatter.Kind() == output.TableFormat {
columns := []output.Column{
prettyFormatter := &output.PrettyTableFormatter{}
columns := []output.PrettyColumn{
{
Heading: "Target",
ValueTemplate: "{{.Target}}",
Column: output.Column{Heading: "TARGET", ValueTemplate: "{{.Target}}"},
Priority: 1,
},
{
Heading: "Context",
ValueTemplate: "{{.Context}}",
Column: output.Column{Heading: "PERMISSION", ValueTemplate: "{{.Permission}}"},
Priority: 1,
ShortValueTemplate: "{{.PermissionSymbol}}",
ColorFunc: consentPermissionColor,
},
{
Heading: "Action",
ValueTemplate: "{{.Action}}",
Column: output.Column{Heading: "SCOPE", ValueTemplate: "{{.Scope}}"},
Priority: 2,
},
{
Heading: "Permission",
ValueTemplate: "{{.Permission}}",
Column: output.Column{Heading: "CONTEXT", ValueTemplate: "{{.Context}}"},
Priority: 2,
},
{
Heading: "Scope",
ValueTemplate: "{{.Scope}}",
Column: output.Column{Heading: "ACTION", ValueTemplate: "{{.Action}}"},
Priority: 3,
},
{
Heading: "Granted At",
ValueTemplate: "{{.GrantedAt}}",
Column: output.Column{Heading: "GRANTED AT", ValueTemplate: "{{.GrantedAt}}"},
Priority: 3,
},
}

return nil, a.formatter.Format(displayRules, a.writer, output.TableFormatterOptions{
Columns: columns,
return nil, prettyFormatter.Format(displayRules, a.writer, output.PrettyTableFormatterOptions{
Columns: columns,
CardGroupColumn: "SCOPE",
})
}

Expand Down Expand Up @@ -630,3 +645,17 @@ func formatConsentRuleDescription(rule consent.ConsentRule) string {
string(rule.Permission),
)
}

// consentPermissionColor applies color formatting based on permission value.
func consentPermissionColor(s string) string {
switch s {
case "allow", "✓":
return output.WithSuccessFormat(s)
case "deny", "✗":
return output.WithErrorFormat(s)
case "prompt", "?":
return output.WithWarningFormat(s)
default:
return output.WithGrayFormat(s)
}
}
20 changes: 11 additions & 9 deletions cli/azd/cmd/extension.go
Original file line number Diff line number Diff line change
Expand Up @@ -1705,23 +1705,25 @@ func (a *extensionSourceListAction) Run(ctx context.Context) (*actions.ActionRes
}

if a.formatter.Kind() == output.TableFormat {
columns := []output.Column{
prettyFormatter := &output.PrettyTableFormatter{}
columns := []output.PrettyColumn{
{
Heading: "Name",
ValueTemplate: "{{.Name}}",
Column: output.Column{Heading: "NAME", ValueTemplate: "{{.Name}}"},
Priority: 1,
},
{
Heading: "Type",
ValueTemplate: "{{.Type}}",
Column: output.Column{Heading: "TYPE", ValueTemplate: "{{.Type}}"},
Priority: 1,
},
{
Heading: "Location",
ValueTemplate: "{{.Location}}",
Column: output.Column{Heading: "LOCATION", ValueTemplate: "{{.Location}}"},
Priority: 2,
},
}

err = a.formatter.Format(sourceConfigs, a.writer, output.TableFormatterOptions{
Columns: columns,
err = prettyFormatter.Format(sourceConfigs, a.writer, output.PrettyTableFormatterOptions{
Columns: columns,
CardGroupColumn: "TYPE",
})
} else {
err = a.formatter.Format(sourceConfigs, a.writer, nil)
Expand Down
88 changes: 67 additions & 21 deletions cli/azd/cmd/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,19 @@ func newTemplateListCmd() *cobra.Command {
}
}

// templateListItem is the display struct for template list table rendering.
// DisplayTags is pre-computed from Tags since Go text/template has no join function.
type templateListItem struct {
Name string `json:"name"`
Title string `json:"title,omitempty"`
Source string `json:"-"`
RepoSource string `json:"source,omitempty"`
Description string `json:"description,omitempty"`
RepositoryPath string `json:"repositoryPath"`
Tags []string `json:"tags"`
DisplayTags string `json:"-"`
}

type templateListAction struct {
flags *templateListFlags
formatter output.Formatter
Expand Down Expand Up @@ -113,24 +126,55 @@ func (tl *templateListAction) Run(ctx context.Context) (*actions.ActionResult, e
}

if tl.formatter.Kind() == output.TableFormat {
columns := []output.Column{
rows := make([]templateListItem, 0, len(listedTemplates))
for _, t := range listedTemplates {
rows = append(rows, templateListItem{
Name: t.Name,
Title: t.Title,
Source: t.Source,
RepoSource: t.RepoSource,
Description: t.Description,
RepositoryPath: t.RepositoryPath,
Tags: t.Tags,
DisplayTags: strings.Join(t.Tags, ", "),
})
}

prettyFormatter := &output.PrettyTableFormatter{}
columns := []output.PrettyColumn{
{
Column: output.Column{
Heading: "NAME",
ValueTemplate: `{{if ne .Name ""}}{{.Name}}{{else}}{{.Title}}{{end}}`,
},
Priority: 1,
},
{
Column: output.Column{Heading: "SOURCE", ValueTemplate: "{{.Source}}"},
Priority: 1,
},
{
Heading: "Name",
ValueTemplate: `{{if ne .Name ""}}{{.Name}}{{else}}{{.Title}}{{end}}`,
Column: output.Column{Heading: "TAGS", ValueTemplate: "{{.DisplayTags}}"},
Priority: 2,
},
{
Heading: "Source",
ValueTemplate: "{{.Source}}",
Column: output.Column{Heading: "DESCRIPTION", ValueTemplate: "{{.Description}}"},
Priority: 3,
},
{
Heading: "Repository Path",
ValueTemplate: `{{if ne .RepositoryPath ""}}{{.RepositoryPath}}{{else}}{{.RepoSource}}{{end}}`,
Transformer: templates.Hyperlink,
Column: output.Column{
Heading: "REPOSITORY PATH",
ValueTemplate: `{{if ne .RepositoryPath ""}}` +
`{{.RepositoryPath}}{{else}}{{.RepoSource}}{{end}}`,
Transformer: templates.Hyperlink,
Comment thread
wbreza marked this conversation as resolved.
},
Priority: 3,
},
}

err = tl.formatter.Format(listedTemplates, tl.writer, output.TableFormatterOptions{
Columns: columns,
err = prettyFormatter.Format(rows, tl.writer, output.PrettyTableFormatterOptions{
Columns: columns,
CardGroupColumn: "SOURCE",
})

if err == nil {
Expand Down Expand Up @@ -327,27 +371,29 @@ func (a *templateSourceListAction) Run(ctx context.Context) (*actions.ActionResu
}

if a.formatter.Kind() == output.TableFormat {
columns := []output.Column{
prettyFormatter := &output.PrettyTableFormatter{}
columns := []output.PrettyColumn{
{
Heading: "Key",
ValueTemplate: "{{.Key}}",
Column: output.Column{Heading: "KEY", ValueTemplate: "{{.Key}}"},
Priority: 1,
},
{
Heading: "Name",
ValueTemplate: "{{.Name}}",
Column: output.Column{Heading: "TYPE", ValueTemplate: "{{.Type}}"},
Priority: 1,
},
{
Heading: "Type",
ValueTemplate: "{{.Type}}",
Column: output.Column{Heading: "NAME", ValueTemplate: "{{.Name}}"},
Priority: 2,
},
{
Heading: "Location",
ValueTemplate: "{{.Location}}",
Column: output.Column{Heading: "LOCATION", ValueTemplate: "{{.Location}}"},
Priority: 3,
},
}

err = a.formatter.Format(sourceConfigs, a.writer, output.TableFormatterOptions{
Columns: columns,
err = prettyFormatter.Format(sourceConfigs, a.writer, output.PrettyTableFormatterOptions{
Columns: columns,
CardGroupColumn: "TYPE",
})
} else {
err = a.formatter.Format(sourceConfigs, a.writer, nil)
Expand Down
Loading
Loading