Skip to content

Commit

Permalink
Improve output and logging (#16)
Browse files Browse the repository at this point in the history
* Validate input, improve logging
* Don't print help on error
* Log structs to stderr
* Write result url to stdout

Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
  • Loading branch information
katexochen committed Apr 11, 2023
1 parent 4c117aa commit 0c53bd5
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 20 deletions.
48 changes: 33 additions & 15 deletions internal/cmd/projectissue.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cmd

import (
"encoding/json"
"errors"
"fmt"
"os"

Expand All @@ -23,8 +24,8 @@ func NewCreateProjectIssueCmd() *cobra.Command {
}

type metadata struct {
Organization string
ProjectNumber int
Organization string // required
ProjectNumber int // required

IssueTitle string
Assignees []string
Expand All @@ -46,44 +47,52 @@ func createProjectIssue(cmd *cobra.Command, _ []string) error {

token, err := getToken()
if err != nil {
return err
return fmt.Errorf("getting token: %w", err)
}

c := newGithubV4Client(cmd.Context(), token, log)

c.logger.Debugf("searching project %s/%d", flags.Metadata.Organization, flags.Metadata.ProjectNumber)
project, err := c.QueryProject(cmd.Context(), flags.Metadata.Organization, flags.Metadata.ProjectNumber)
if err != nil {
return err
return fmt.Errorf("querying project: %w", err)
}
c.logger.PrintJSON("found project", project)

var assigneeIDs []githubv4.ID
for _, assignee := range flags.Metadata.Assignees {
c.logger.Debugf("searching user %s", assignee)
user, err := c.QueryUser(cmd.Context(), assignee)
if err != nil {
return err
return fmt.Errorf("querying user: %w", err)
}
c.logger.PrintJSON("found user", user)
assigneeIDs = append(assigneeIDs, user.ID)
}

addDraftIssueInput := githubv4.AddProjectV2DraftIssueInput{
ProjectID: project.ID,
Title: githubv4.String(flags.Metadata.IssueTitle),
Body: toPtr(githubv4.String(flags.Body)),
AssigneeIDs: toPtr(assigneeIDs),
ProjectID: project.ID,
Title: githubv4.String(flags.Metadata.IssueTitle),
}
if flags.Body != "" {
addDraftIssueInput.Body = toPtr(githubv4.String(flags.Body))
}
if len(flags.Metadata.Assignees) > 0 {
addDraftIssueInput.AssigneeIDs = toPtr(assigneeIDs)
}

item, err := c.AddProjectV2DraftIssue(cmd.Context(), addDraftIssueInput)
if err != nil {
return err
return fmt.Errorf("adding project issue: %w", err)
}

if err := c.UpdateProjectV2ItemFieldValueInput(cmd.Context(), project, item.ID, flags.Metadata.Fields); err != nil {
return err
return fmt.Errorf("updating project issue fields: %w", err)
}

itemURL := fmt.Sprintf("%s?pane=issue&itemId=%d", project.URL, item.DatabaseID)
c.logger.Infof("created project issue %s", itemURL)
c.logger.Infof("created project issue:")
fmt.Println(itemURL)

return nil
}
Expand All @@ -107,14 +116,23 @@ func parseCreateProjectIssueFlags(cmd *cobra.Command) (createProjectIssueFlags,
if err := json.Unmarshal(metadataBytes, &metadata); err != nil {
return createProjectIssueFlags{}, err
}
if metadata.Organization == "" {
return createProjectIssueFlags{}, errors.New("validating metadata fields: organization is required")
}
if metadata.ProjectNumber == 0 {
return createProjectIssueFlags{}, errors.New("validating metadata fields: project number is required")
}

bodyPath, err := cmd.Flags().GetString("body")
if err != nil {
return createProjectIssueFlags{}, err
}
bodyBytes, err := os.ReadFile(bodyPath)
if err != nil {
return createProjectIssueFlags{}, err
var bodyBytes []byte
if bodyPath != "" {
bodyBytes, err = os.ReadFile(bodyPath)
if err != nil {
return createProjectIssueFlags{}, err
}
}

verbose, err := cmd.Flags().GetBool("verbose")
Expand Down
5 changes: 2 additions & 3 deletions internal/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,9 @@ func (l *VerboseLogger) Debugln(args ...any) {
// PrintJSON logs a JSON representation of v.
func (l *VerboseLogger) PrintJSON(msg string, v any) {
l.Infoln(msg + ":")
w := json.NewEncoder(os.Stdout)
w := json.NewEncoder(os.Stderr)
w.SetIndent("", " ")
err := w.Encode(v)
if err != nil {
if err := w.Encode(v); err != nil {
panic(err)
}
}
9 changes: 7 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ func run() error {

func newRootCmd() *cobra.Command {
rootCmd := &cobra.Command{
Use: "ghh",
Short: "GitHub Helper CLI",
Use: "ghh",
Short: "GitHub Helper CLI",
PersistentPreRun: preRunRoot,
}

rootCmd.SetOut(os.Stdout)
Expand Down Expand Up @@ -65,3 +66,7 @@ func signalContext(ctx context.Context, sig os.Signal) (context.Context, context

return sigCtx, cancelFunc
}

func preRunRoot(cmd *cobra.Command, _ []string) {
cmd.SilenceUsage = true
}

0 comments on commit 0c53bd5

Please sign in to comment.