From 4dcb528f70bd53cd8b64aa48003d4821508ad15c Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Fri, 30 Dec 2022 16:18:11 +0100 Subject: [PATCH] Add Group Json Output --- group/get.go | 79 +++++++++++++++++++++++++++++++++++---------------- group/json.go | 19 +++++++++++++ group/list.go | 64 +++++++++++++++++++++++++++-------------- 3 files changed, 116 insertions(+), 46 deletions(-) create mode 100644 group/json.go diff --git a/group/get.go b/group/get.go index f7dcdeb..db2d9b0 100644 --- a/group/get.go +++ b/group/get.go @@ -2,6 +2,7 @@ package group import ( "context" + "encoding/json" "fmt" "strings" @@ -37,6 +38,10 @@ func GroupGet(cmd *cobra.Command, args []string) error { if err != nil { return err } + jsonOutput, err := cmd.Flags().GetBool("json") + if err != nil { + return err + } ctx := util.GetContext() @@ -55,34 +60,58 @@ func GroupGet(cmd *cobra.Command, args []string) error { if err != nil { return fmt.Errorf("Getting Group: %w", err) } - fmt.Printf("Name: %v\n", name) - // Print Memberships - if len(columns) != 0 { - data := pterm.TableData{columns} - for _, membership := range memberships { - entry := make([]string, len(columns)) - for i := range columns { - switch strings.ToLower(columns[i]) { - case "userid": - entry[i] = membership.UserID - case "isgroupmanager": - entry[i] = fmt.Sprint(membership.IsGroupManager) - case "username": - entry[i] = shellescape.StripUnsafe(membership.Username) - case "userfirstname": - entry[i] = shellescape.StripUnsafe(membership.UserFirstName) - case "userlastname": - entry[i] = shellescape.StripUnsafe(membership.UserLastName) - default: - cmd.SilenceUsage = false - return fmt.Errorf("Unknown Column: %v", columns[i]) - } - } - data = append(data, entry) + if jsonOutput { + groupUserMemberships := []GroupUserMembershipJsonOutput{} + for i := range memberships { + groupUserMemberships = append(groupUserMemberships, GroupUserMembershipJsonOutput{ + ID: &memberships[i].UserID, + Username: &memberships[i].Username, + FirstName: &memberships[i].UserFirstName, + LastName: &memberships[i].UserLastName, + IsGroupManager: &memberships[i].IsGroupManager, + }) } - pterm.DefaultTable.WithHasHeader().WithData(data).Render() + jsonGroup, err := json.MarshalIndent(GroupJsonOutput{ + Name: &name, + Users: groupUserMemberships, + }, "", " ") + if err != nil { + return err + } + fmt.Println(string(jsonGroup)) + + } else { + fmt.Printf("Name: %v\n", name) + // Print Memberships + if len(columns) != 0 { + data := pterm.TableData{columns} + + for _, membership := range memberships { + entry := make([]string, len(columns)) + for i := range columns { + switch strings.ToLower(columns[i]) { + case "userid": + entry[i] = membership.UserID + case "isgroupmanager": + entry[i] = fmt.Sprint(membership.IsGroupManager) + case "username": + entry[i] = shellescape.StripUnsafe(membership.Username) + case "userfirstname": + entry[i] = shellescape.StripUnsafe(membership.UserFirstName) + case "userlastname": + entry[i] = shellescape.StripUnsafe(membership.UserLastName) + default: + cmd.SilenceUsage = false + return fmt.Errorf("Unknown Column: %v", columns[i]) + } + } + data = append(data, entry) + } + + pterm.DefaultTable.WithHasHeader().WithData(data).Render() + } } return nil } diff --git a/group/json.go b/group/json.go new file mode 100644 index 0000000..84d6b11 --- /dev/null +++ b/group/json.go @@ -0,0 +1,19 @@ +package group + +import "time" + +type GroupJsonOutput struct { + ID *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Users []GroupUserMembershipJsonOutput `json:"users,omitempty"` + CreatedTimestamp *time.Time `json:"created_timestamp,omitempty"` + ModifiedTimestamp *time.Time `json:"modified_timestamp,omitempty"` +} + +type GroupUserMembershipJsonOutput struct { + ID *string `json:"id,omitempty"` + Username *string `json:"username,omitempty"` + FirstName *string `json:"first_name,omitempty"` + LastName *string `json:"last_name,omitempty"` + IsGroupManager *bool `json:"is_group_manager,omitempty"` +} diff --git a/group/list.go b/group/list.go index 74cddfc..6faa9c5 100644 --- a/group/list.go +++ b/group/list.go @@ -2,6 +2,7 @@ package group import ( "context" + "encoding/json" "fmt" "strings" "time" @@ -46,6 +47,10 @@ func GroupList(cmd *cobra.Command, args []string) error { if len(columns) == 0 { return fmt.Errorf("You need to specify atleast one column to return") } + jsonOutput, err := cmd.Flags().GetBool("json") + if err != nil { + return err + } ctx := util.GetContext() @@ -64,28 +69,45 @@ func GroupList(cmd *cobra.Command, args []string) error { return fmt.Errorf("Listing Group: %w", err) } - data := pterm.TableData{columns} - - for _, group := range groups { - entry := make([]string, len(columns)) - for i := range columns { - switch strings.ToLower(columns[i]) { - case "id": - entry[i] = group.ID - case "name": - entry[i] = shellescape.StripUnsafe(group.Name) - case "createdtimestamp": - entry[i] = group.Created.Format(time.RFC3339) - case "modifiedtimestamp": - entry[i] = group.Modified.Format(time.RFC3339) - default: - cmd.SilenceUsage = false - return fmt.Errorf("Unknown Column: %v", columns[i]) - } + if jsonOutput { + outputGroups := []GroupJsonOutput{} + for i := range groups { + outputGroups = append(outputGroups, GroupJsonOutput{ + ID: &groups[i].ID, + Name: &groups[i].Name, + CreatedTimestamp: &groups[i].Created.Time, + ModifiedTimestamp: &groups[i].Modified.Time, + }) } - data = append(data, entry) - } + jsonGroups, err := json.MarshalIndent(outputGroups, "", " ") + if err != nil { + return err + } + fmt.Println(string(jsonGroups)) + } else { + data := pterm.TableData{columns} - pterm.DefaultTable.WithHasHeader().WithData(data).Render() + for _, group := range groups { + entry := make([]string, len(columns)) + for i := range columns { + switch strings.ToLower(columns[i]) { + case "id": + entry[i] = group.ID + case "name": + entry[i] = shellescape.StripUnsafe(group.Name) + case "createdtimestamp": + entry[i] = group.Created.Format(time.RFC3339) + case "modifiedtimestamp": + entry[i] = group.Modified.Format(time.RFC3339) + default: + cmd.SilenceUsage = false + return fmt.Errorf("Unknown Column: %v", columns[i]) + } + } + data = append(data, entry) + } + + pterm.DefaultTable.WithHasHeader().WithData(data).Render() + } return nil }