From c8dc067697e2429a538c6772d2450ec1c78c5ffe Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Fri, 30 Dec 2022 16:08:14 +0100 Subject: [PATCH] Add User Json Output --- user/get.go | 27 ++++++++++++++---- user/json.go | 13 +++++++++ user/list.go | 79 ++++++++++++++++++++++++++++++++++------------------ 3 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 user/json.go diff --git a/user/get.go b/user/get.go index 62029c8..d75522b 100644 --- a/user/get.go +++ b/user/get.go @@ -2,6 +2,7 @@ package user import ( "context" + "encoding/json" "fmt" "github.com/alessio/shellescape" @@ -29,6 +30,10 @@ func UserGet(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() @@ -47,10 +52,22 @@ func UserGet(cmd *cobra.Command, args []string) error { if err != nil { return fmt.Errorf("Getting User: %w", err) } - fmt.Printf("Username: %v\n", shellescape.StripUnsafe(username)) - fmt.Printf("FirstName: %v\n", shellescape.StripUnsafe(firstname)) - fmt.Printf("LastName: %v\n", shellescape.StripUnsafe(lastname)) - fmt.Printf("Role: %v\n", shellescape.StripUnsafe(role)) - + if jsonOutput { + jsonUser, err := json.MarshalIndent(UserJsonOutput{ + Username: &username, + FirstName: &firstname, + LastName: &lastname, + Role: &role, + }, "", " ") + if err != nil { + return err + } + fmt.Println(string(jsonUser)) + } else { + fmt.Printf("Username: %v\n", shellescape.StripUnsafe(username)) + fmt.Printf("FirstName: %v\n", shellescape.StripUnsafe(firstname)) + fmt.Printf("LastName: %v\n", shellescape.StripUnsafe(lastname)) + fmt.Printf("Role: %v\n", shellescape.StripUnsafe(role)) + } return nil } diff --git a/user/json.go b/user/json.go new file mode 100644 index 0000000..9b04988 --- /dev/null +++ b/user/json.go @@ -0,0 +1,13 @@ +package user + +import "time" + +type UserJsonOutput struct { + ID *string `json:"id,omitempty"` + Username *string `json:"username,omitempty"` + FirstName *string `json:"first_name,omitempty"` + LastName *string `json:"last_name,omitempty"` + Role *string `json:"role,omitempty"` + CreatedTimestamp *time.Time `json:"created_timestamp,omitempty"` + ModifiedTimestamp *time.Time `json:"modified_timestamp,omitempty"` +} diff --git a/user/list.go b/user/list.go index aa55d28..32ff273 100644 --- a/user/list.go +++ b/user/list.go @@ -2,6 +2,7 @@ package user import ( "context" + "encoding/json" "fmt" "strings" "time" @@ -57,6 +58,10 @@ func UserList(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() @@ -77,34 +82,54 @@ func UserList(cmd *cobra.Command, args []string) error { return fmt.Errorf("Listing User: %w", err) } - data := pterm.TableData{columns} - - for _, user := range users { - entry := make([]string, len(columns)) - for i := range columns { - switch strings.ToLower(columns[i]) { - case "id": - entry[i] = user.ID - case "username": - entry[i] = shellescape.StripUnsafe(user.Username) - case "firstname": - entry[i] = shellescape.StripUnsafe(user.Profile.FirstName) - case "lastname": - entry[i] = shellescape.StripUnsafe(user.Profile.LastName) - case "role": - entry[i] = shellescape.StripUnsafe(user.Role.Name) - case "createdtimestamp": - entry[i] = user.Created.Format(time.RFC3339) - case "modifiedtimestamp": - entry[i] = user.Modified.Format(time.RFC3339) - default: - cmd.SilenceUsage = false - return fmt.Errorf("Unknown Column: %v", columns[i]) - } + if jsonOutput { + outputUsers := []UserJsonOutput{} + for i := range users { + outputUsers = append(outputUsers, UserJsonOutput{ + ID: &users[i].ID, + Username: &users[i].Username, + FirstName: &users[i].Profile.FirstName, + LastName: &users[i].Profile.LastName, + Role: &users[i].Role.Name, + CreatedTimestamp: &users[i].Created.Time, + ModifiedTimestamp: &users[i].Modified.Time, + }) } - data = append(data, entry) - } + jsonUsers, err := json.MarshalIndent(outputUsers, "", " ") + if err != nil { + return err + } + fmt.Println(string(jsonUsers)) + } else { + data := pterm.TableData{columns} - pterm.DefaultTable.WithHasHeader().WithData(data).Render() + for _, user := range users { + entry := make([]string, len(columns)) + for i := range columns { + switch strings.ToLower(columns[i]) { + case "id": + entry[i] = user.ID + case "username": + entry[i] = shellescape.StripUnsafe(user.Username) + case "firstname": + entry[i] = shellescape.StripUnsafe(user.Profile.FirstName) + case "lastname": + entry[i] = shellescape.StripUnsafe(user.Profile.LastName) + case "role": + entry[i] = shellescape.StripUnsafe(user.Role.Name) + case "createdtimestamp": + entry[i] = user.Created.Format(time.RFC3339) + case "modifiedtimestamp": + entry[i] = user.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 }