Skip to content

Commit 10a1eca

Browse files
incus/cluster/group/list: Add support for column selection
Part of #1027 Signed-off-by: HassanAlsamahi <[email protected]>
1 parent 051eefb commit 10a1eca

File tree

1 file changed

+60
-5
lines changed

1 file changed

+60
-5
lines changed

cmd/incus/cluster_group.go

+60-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ type cmdClusterGroup struct {
2222
cluster *cmdCluster
2323
}
2424

25+
type clusterGroupColumn struct {
26+
Name string
27+
Data func(api.ClusterGroup) string
28+
}
29+
2530
// Cluster management including assignment, creation, deletion, editing, listing, removal, renaming, and showing details.
2631
func (c *cmdClusterGroup) Command() *cobra.Command {
2732
cmd := &cobra.Command{}
@@ -487,6 +492,47 @@ Pre-defined column shorthand chars:
487492

488493
const defaultClusterGroupColumns = "ndm"
489494

495+
func (c *cmdClusterGroupList) parseColumns() ([]clusterGroupColumn, error) {
496+
columnsShorthandMap := map[rune]clusterGroupColumn{
497+
'n': {i18n.G("NAME"), c.clusterGroupNameColumnData},
498+
'm': {i18n.G("MEMBERS"), c.membersColumnData},
499+
'd': {i18n.G("DESCRIPTION"), c.descriptionColumnData},
500+
}
501+
502+
columnList := strings.Split(c.flagColumns, ",")
503+
504+
columns := []clusterGroupColumn{}
505+
506+
for _, columnEntry := range columnList {
507+
if columnEntry == "" {
508+
return nil, fmt.Errorf(i18n.G("Empty column entry (redundant, leading or trailing command) in '%s'"), c.flagColumns)
509+
}
510+
511+
for _, columnRune := range columnEntry {
512+
column, ok := columnsShorthandMap[columnRune]
513+
if !ok {
514+
return nil, fmt.Errorf(i18n.G("Unknown column shorthand char '%c' in '%s'"), columnRune, columnEntry)
515+
}
516+
517+
columns = append(columns, column)
518+
}
519+
}
520+
521+
return columns, nil
522+
}
523+
524+
func (c *cmdClusterGroupList) clusterGroupNameColumnData(group api.ClusterGroup) string {
525+
return group.Name
526+
}
527+
528+
func (c *cmdClusterGroupList) descriptionColumnData(group api.ClusterGroup) string {
529+
return group.Description
530+
}
531+
532+
func (c *cmdClusterGroupList) membersColumnData(group api.ClusterGroup) string {
533+
return fmt.Sprintf("%d", len(group.Members))
534+
}
535+
490536
// Run executes the command to list all the cluster groups, their descriptions, and number of members.
491537
func (c *cmdClusterGroupList) Run(cmd *cobra.Command, args []string) error {
492538
// Quick checks.
@@ -523,19 +569,28 @@ func (c *cmdClusterGroupList) Run(cmd *cobra.Command, args []string) error {
523569
return err
524570
}
525571

572+
// Parse column flags.
573+
columns, err := c.parseColumns()
574+
if err != nil {
575+
return err
576+
}
577+
526578
// Render the table
527579
data := [][]string{}
528580
for _, group := range groups {
529-
line := []string{group.Name, group.Description, fmt.Sprintf("%d", len(group.Members))}
581+
line := []string{}
582+
for _, column := range columns {
583+
line = append(line, column.Data(group))
584+
}
585+
530586
data = append(data, line)
531587
}
532588

533589
sort.Sort(cli.SortColumnsNaturally(data))
534590

535-
header := []string{
536-
i18n.G("NAME"),
537-
i18n.G("DESCRIPTION"),
538-
i18n.G("MEMBERS"),
591+
header := []string{}
592+
for _, column := range columns {
593+
header = append(header, column.Name)
539594
}
540595

541596
return cli.RenderTable(c.flagFormat, header, data, groups)

0 commit comments

Comments
 (0)