Skip to content

Commit 89d1847

Browse files
authored
refactor(issue-fields): unexport IssueWriteFieldInput, fix issue_fields schema with oneOf
1 parent 7b1b06c commit 89d1847

2 files changed

Lines changed: 44 additions & 12 deletions

File tree

pkg/github/__toolsnaps__/issue_write.snap

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,41 @@
3030
"type": "number"
3131
},
3232
"issue_fields": {
33-
"description": "Issue field values to set. Each item requires 'field_name' and either 'value' or 'field_option_name'. Use 'field_option_name' for single-select fields to validate the option exists.",
33+
"description": "Issue field values to set. Each item requires 'field_name' and exactly one of 'value' or 'field_option_name'.",
3434
"items": {
35+
"oneOf": [
36+
{
37+
"not": {
38+
"required": [
39+
"field_option_name"
40+
]
41+
},
42+
"required": [
43+
"value"
44+
]
45+
},
46+
{
47+
"not": {
48+
"required": [
49+
"value"
50+
]
51+
},
52+
"required": [
53+
"field_option_name"
54+
]
55+
}
56+
],
3557
"properties": {
3658
"field_name": {
3759
"description": "Issue field name",
3860
"type": "string"
3961
},
4062
"field_option_name": {
41-
"description": "Single-select option name (validates option exists before setting)",
63+
"description": "Option name for single-select fields — validates the option exists in the field definition before setting it.",
4264
"type": "string"
4365
},
4466
"value": {
45-
"description": "Value for text/number/date/single-select fields"
67+
"description": "Value to set. For single-select fields, prefer 'field_option_name' to validate the option exists first."
4668
}
4769
},
4870
"required": [

pkg/github/issues.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ type CloseIssueInput struct {
3737
// Used to extend the functionality of the githubv4 library to support closing issues as duplicates.
3838
type IssueClosedStateReason string
3939

40-
// IssueWriteFieldInput is a user-friendly issue field input for issue_write.
40+
// issueWriteFieldInput is a user-friendly issue field input for issue_write.
4141
// Field IDs and option IDs are resolved internally before calling the REST API.
42-
type IssueWriteFieldInput struct {
42+
type issueWriteFieldInput struct {
4343
FieldName string
4444
Value any
4545
FieldOptionName string
@@ -201,7 +201,7 @@ type IssueFieldValueFragment struct {
201201
} `graphql:"... on IssueFieldTextValue"`
202202
}
203203

204-
func optionalIssueWriteFields(args map[string]any) ([]IssueWriteFieldInput, error) {
204+
func optionalIssueWriteFields(args map[string]any) ([]issueWriteFieldInput, error) {
205205
issueFieldsRaw, exists := args["issue_fields"]
206206
if !exists {
207207
return nil, nil
@@ -223,7 +223,7 @@ func optionalIssueWriteFields(args map[string]any) ([]IssueWriteFieldInput, erro
223223
return nil, fmt.Errorf("issue_fields must be an array")
224224
}
225225

226-
issueFields := make([]IssueWriteFieldInput, 0, len(inputMaps))
226+
issueFields := make([]issueWriteFieldInput, 0, len(inputMaps))
227227
for _, itemMap := range inputMaps {
228228
fieldName, err := RequiredParam[string](itemMap, "field_name")
229229
if err != nil || strings.TrimSpace(fieldName) == "" {
@@ -248,7 +248,7 @@ func optionalIssueWriteFields(args map[string]any) ([]IssueWriteFieldInput, erro
248248
return nil, fmt.Errorf("issue field %q must specify either value or field_option_name", fieldName)
249249
}
250250

251-
issueFields = append(issueFields, IssueWriteFieldInput{
251+
issueFields = append(issueFields, issueWriteFieldInput{
252252
FieldName: fieldName,
253253
Value: value,
254254
FieldOptionName: fieldOptionName,
@@ -258,7 +258,7 @@ func optionalIssueWriteFields(args map[string]any) ([]IssueWriteFieldInput, erro
258258
return issueFields, nil
259259
}
260260

261-
func resolveIssueRequestFieldValues(ctx context.Context, gqlClient *githubv4.Client, owner, repo string, issueFields []IssueWriteFieldInput) ([]*github.IssueRequestFieldValue, error) {
261+
func resolveIssueRequestFieldValues(ctx context.Context, gqlClient *githubv4.Client, owner, repo string, issueFields []issueWriteFieldInput) ([]*github.IssueRequestFieldValue, error) {
262262
if len(issueFields) == 0 {
263263
return nil, nil
264264
}
@@ -1719,7 +1719,7 @@ Options are:
17191719
},
17201720
"issue_fields": {
17211721
Type: "array",
1722-
Description: "Issue field values to set. Each item requires 'field_name' and either 'value' or 'field_option_name'. Use 'field_option_name' for single-select fields to validate the option exists.",
1722+
Description: "Issue field values to set. Each item requires 'field_name' and exactly one of 'value' or 'field_option_name'.",
17231723
Items: &jsonschema.Schema{
17241724
Type: "object",
17251725
Properties: map[string]*jsonschema.Schema{
@@ -1728,14 +1728,24 @@ Options are:
17281728
Description: "Issue field name",
17291729
},
17301730
"value": {
1731-
Description: "Value for text/number/date/single-select fields",
1731+
Description: "Value to set. For single-select fields, prefer 'field_option_name' to validate the option exists first.",
17321732
},
17331733
"field_option_name": {
17341734
Type: "string",
1735-
Description: "Single-select option name (validates option exists before setting)",
1735+
Description: "Option name for single-select fields — validates the option exists in the field definition before setting it.",
17361736
},
17371737
},
17381738
Required: []string{"field_name"},
1739+
OneOf: []*jsonschema.Schema{
1740+
{
1741+
Required: []string{"value"},
1742+
Not: &jsonschema.Schema{Required: []string{"field_option_name"}},
1743+
},
1744+
{
1745+
Required: []string{"field_option_name"},
1746+
Not: &jsonschema.Schema{Required: []string{"value"}},
1747+
},
1748+
},
17391749
},
17401750
},
17411751
},

0 commit comments

Comments
 (0)