@@ -574,22 +574,92 @@ type cmdConfigTrustListTokens struct {
574
574
config * cmdConfig
575
575
configTrust * cmdConfigTrust
576
576
577
- flagFormat string
577
+ flagFormat string
578
+ flagColumns string
579
+ }
580
+
581
+ type configTrustListTokenColumn struct {
582
+ Name string
583
+ Data func (* api.CertificateAddToken ) string
578
584
}
579
585
580
586
func (c * cmdConfigTrustListTokens ) Command () * cobra.Command {
581
587
cmd := & cobra.Command {}
582
588
cmd .Use = usage ("list-tokens" , i18n .G ("[<remote>:]" ))
583
589
cmd .Short = i18n .G ("List all active certificate add tokens" )
584
590
cmd .Long = cli .FormatSection (i18n .G ("Description" ), i18n .G (
585
- `List all active certificate add tokens` ))
591
+ `List all active certificate add tokens
592
+
593
+ Default column layout: ntE
594
+
595
+ == Columns ==
596
+ The -c option takes a comma separated list of arguments that control
597
+ which network zone attributes to output when displaying in table or csv
598
+ format.
599
+
600
+ Column arguments are either pre-defined shorthand chars (see below),
601
+ or (extended) config keys.
602
+
603
+ Commas between consecutive shorthand chars are optional.
604
+
605
+ Pre-defined column shorthand chars:
606
+ n - Name
607
+ t - Token
608
+ E - Expires At` ))
586
609
cmd .Flags ().StringVarP (& c .flagFormat , "format" , "f" , "table" , i18n .G ("Format (csv|json|table|yaml|compact)" )+ "``" )
610
+ cmd .Flags ().StringVarP (& c .flagColumns , "columns" , "c" , defaultConfigTrustListTokenColumns , i18n .G ("Columns" )+ "``" )
587
611
588
612
cmd .RunE = c .Run
589
613
590
614
return cmd
591
615
}
592
616
617
+ const defaultConfigTrustListTokenColumns = "ntE"
618
+
619
+ func (c * cmdConfigTrustListTokens ) parseColumns () ([]configTrustListTokenColumn , error ) {
620
+ columnsShorthandMap := map [rune ]configTrustListTokenColumn {
621
+ 'n' : {i18n .G ("NAME" ), c .clientNameColumnData },
622
+ 't' : {i18n .G ("TOKEN" ), c .tokenColumnData },
623
+ 'E' : {i18n .G ("EXPIRES AT" ), c .expiresAtColumnData },
624
+ }
625
+
626
+ columnList := strings .Split (c .flagColumns , "," )
627
+ columns := []configTrustListTokenColumn {}
628
+
629
+ for _ , columnEntry := range columnList {
630
+ if columnEntry == "" {
631
+ return nil , fmt .Errorf (i18n .G ("Empty column entry (redundant, leading or trailing command) in '%s'" ), c .flagColumns )
632
+ }
633
+
634
+ for _ , columnRune := range columnEntry {
635
+ column , ok := columnsShorthandMap [columnRune ]
636
+ if ! ok {
637
+ return nil , fmt .Errorf (i18n .G ("Unknown column shorthand char '%c' in '%s'" ), columnRune , columnEntry )
638
+ }
639
+
640
+ columns = append (columns , column )
641
+ }
642
+ }
643
+
644
+ return columns , nil
645
+ }
646
+
647
+ func (c * cmdConfigTrustListTokens ) clientNameColumnData (token * api.CertificateAddToken ) string {
648
+ return token .ClientName
649
+ }
650
+
651
+ func (c * cmdConfigTrustListTokens ) tokenColumnData (token * api.CertificateAddToken ) string {
652
+ return token .String ()
653
+ }
654
+
655
+ func (c * cmdConfigTrustListTokens ) expiresAtColumnData (token * api.CertificateAddToken ) string {
656
+ if token .ExpiresAt .IsZero () {
657
+ return " "
658
+ }
659
+
660
+ return token .ExpiresAt .Local ().Format (dateLayout )
661
+ }
662
+
593
663
func (c * cmdConfigTrustListTokens ) Run (cmd * cobra.Command , args []string ) error {
594
664
// Quick checks.
595
665
exit , err := c .global .CheckArgs (cmd , args , 0 , 1 )
@@ -616,14 +686,14 @@ func (c *cmdConfigTrustListTokens) Run(cmd *cobra.Command, args []string) error
616
686
return err
617
687
}
618
688
619
- // Convert the join token operation into encoded form for display.
620
- type displayToken struct {
621
- ClientName string
622
- Token string
623
- ExpiresAt string
624
- }
689
+ data := [][]string {}
690
+ joinTokens := []* api.CertificateAddToken {}
625
691
626
- displayTokens := make ([]displayToken , 0 )
692
+ // Parse column flags.
693
+ columns , err := c .parseColumns ()
694
+ if err != nil {
695
+ return err
696
+ }
627
697
628
698
for _ , op := range ops {
629
699
if op .Class != api .OperationClassToken {
@@ -639,36 +709,23 @@ func (c *cmdConfigTrustListTokens) Run(cmd *cobra.Command, args []string) error
639
709
continue // Operation is not a valid certificate add token operation.
640
710
}
641
711
642
- var expiresAt string
643
-
644
- // Only show the expiry date if available, otherwise show an empty string.
645
- if ! joinToken .ExpiresAt .IsZero () {
646
- expiresAt = joinToken .ExpiresAt .Local ().Format (dateLayout )
712
+ line := []string {}
713
+ for _ , column := range columns {
714
+ line = append (line , column .Data (joinToken ))
647
715
}
648
716
649
- displayTokens = append (displayTokens , displayToken {
650
- ClientName : joinToken .ClientName ,
651
- Token : joinToken .String (),
652
- ExpiresAt : expiresAt ,
653
- })
654
- }
655
-
656
- // Render the table.
657
- data := [][]string {}
658
- for _ , token := range displayTokens {
659
- line := []string {token .ClientName , token .Token , token .ExpiresAt }
717
+ joinTokens = append (joinTokens , joinToken )
660
718
data = append (data , line )
661
719
}
662
720
663
721
sort .Sort (cli .SortColumnsNaturally (data ))
664
722
665
- header := []string {
666
- i18n .G ("NAME" ),
667
- i18n .G ("TOKEN" ),
668
- i18n .G ("EXPIRES AT" ),
723
+ header := []string {}
724
+ for _ , column := range columns {
725
+ header = append (header , column .Name )
669
726
}
670
727
671
- return cli .RenderTable (c .flagFormat , header , data , displayTokens )
728
+ return cli .RenderTable (c .flagFormat , header , data , joinTokens )
672
729
}
673
730
674
731
// Remove.
0 commit comments