Skip to content
This repository has been archived by the owner on Jun 21, 2023. It is now read-only.

Commit

Permalink
display single select options in json format (#86)
Browse files Browse the repository at this point in the history
* fix a bug and display options in json format

* remove inline structs

* rename for clarity

* not needed

* fix tests
  • Loading branch information
mntlty authored Apr 19, 2023
1 parent 63b5a13 commit 12f2e75
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 10 deletions.
5 changes: 3 additions & 2 deletions cmd/field-create/field_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,11 @@ func createFieldArgs(config createFieldConfig) (*createProjectV2FieldMutation, m
}

if len(config.opts.singleSelectOptions) != 0 {
opts := make([]githubv4.ProjectV2SingleSelectFieldOptionInput, len(config.opts.singleSelectOptions))
opts := make([]githubv4.ProjectV2SingleSelectFieldOptionInput, 0)
for _, opt := range config.opts.singleSelectOptions {
opts = append(opts, githubv4.ProjectV2SingleSelectFieldOptionInput{
Name: githubv4.String(opt),
Name: githubv4.String(opt),
Color: githubv4.ProjectV2SingleSelectFieldOptionColor("GRAY"),
})
}
input.SingleSelectOptions = &opts
Expand Down
32 changes: 27 additions & 5 deletions format/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,23 +104,39 @@ type projectJSON struct {

// JSONProjectField serializes a ProjectField to JSON.
func JSONProjectField(field queries.ProjectField) ([]byte, error) {
return json.Marshal(projectFieldJSON{
val := projectFieldJSON{
ID: field.ID(),
Name: field.Name(),
Type: field.Type(),
})
}
for _, o := range field.Options() {
val.Options = append(val.Options, singleSelectOptionJSON{
Name: o.Name,
ID: o.ID,
})
}

return json.Marshal(val)
}

// JSONProjectFields serializes a slice of ProjectFields to JSON.
// JSON fields are `totalCount` and `fields`.
func JSONProjectFields(project *queries.Project) ([]byte, error) {
var result []projectFieldJSON
for _, f := range project.Fields.Nodes {
result = append(result, projectFieldJSON{
val := projectFieldJSON{
ID: f.ID(),
Name: f.Name(),
Type: f.Type(),
})
}
for _, o := range f.Options() {
val.Options = append(val.Options, singleSelectOptionJSON{
Name: o.Name,
ID: o.ID,
})
}

result = append(result, val)
}

return json.Marshal(struct {
Expand All @@ -133,9 +149,15 @@ func JSONProjectFields(project *queries.Project) ([]byte, error) {
}

type projectFieldJSON struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Options []singleSelectOptionJSON `json:"options,omitempty"`
}

type singleSelectOptionJSON struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
}

// JSONProjectItem serializes a ProjectItem to JSON.
Expand Down
31 changes: 28 additions & 3 deletions format/json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,21 @@ func TestJSONProjectField_SingleSelectType(t *testing.T) {
field.TypeName = "ProjectV2SingleSelectField"
field.SingleSelectField.ID = "123"
field.SingleSelectField.Name = "name"
field.SingleSelectField.Options = []queries.SingleSelectFieldOptions{
{
ID: "123",
Name: "name",
},
{
ID: "456",
Name: "name2",
},
}

b, err := JSONProjectField(field)
assert.NoError(t, err)

assert.Equal(t, `{"id":"123","name":"name","type":"ProjectV2SingleSelectField"}`, string(b))
assert.Equal(t, `{"id":"123","name":"name","type":"ProjectV2SingleSelectField","options":[{"id":"123","name":"name"},{"id":"456","name":"name2"}]}`, string(b))
}

func TestJSONProjectField_ProjectV2IterationField(t *testing.T) {
Expand All @@ -127,20 +137,35 @@ func TestJSONProjectFields(t *testing.T) {
field.Field.ID = "123"
field.Field.Name = "name"

field2 := queries.ProjectField{}
field2.TypeName = "ProjectV2SingleSelectField"
field2.SingleSelectField.ID = "123"
field2.SingleSelectField.Name = "name"
field2.SingleSelectField.Options = []queries.SingleSelectFieldOptions{
{
ID: "123",
Name: "name",
},
{
ID: "456",
Name: "name2",
},
}

p := &queries.Project{
Fields: struct {
TotalCount int
Nodes []queries.ProjectField
PageInfo queries.PageInfo
}{
Nodes: []queries.ProjectField{field},
Nodes: []queries.ProjectField{field, field2},
TotalCount: 5,
},
}
b, err := JSONProjectFields(p)
assert.NoError(t, err)

assert.Equal(t, `{"fields":[{"id":"123","name":"name","type":"ProjectV2Field"}],"totalCount":5}`, string(b))
assert.Equal(t, `{"fields":[{"id":"123","name":"name","type":"ProjectV2Field"},{"id":"123","name":"name","type":"ProjectV2SingleSelectField","options":[{"id":"123","name":"name"},{"id":"456","name":"name2"}]}],"totalCount":5}`, string(b))
}

func TestJSONProjectItem_DraftIssue(t *testing.T) {
Expand Down
20 changes: 20 additions & 0 deletions queries/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ type ProjectField struct {
ID string
Name string
DataType string
Options []SingleSelectFieldOptions
} `graphql:"... on ProjectV2SingleSelectField"`
}

Expand Down Expand Up @@ -544,6 +545,25 @@ func (p ProjectField) Type() string {
return p.TypeName
}

type SingleSelectFieldOptions struct {
ID string
Name string
}

func (p ProjectField) Options() []SingleSelectFieldOptions {
if p.TypeName == "ProjectV2SingleSelectField" {
var options []SingleSelectFieldOptions
for _, o := range p.SingleSelectField.Options {
options = append(options, SingleSelectFieldOptions{
ID: o.ID,
Name: o.Name,
})
}
return options
}
return nil
}

// ProjectFields returns a project with fields. If the OwnerType is VIEWER, no login is required.
func ProjectFields(client api.GQLClient, o *Owner, number int, limit int) (*Project, error) {
project := &Project{}
Expand Down

0 comments on commit 12f2e75

Please sign in to comment.