(ctx context.Context, gqlClient *githubv4.Client, owner, repo string, issueFields []issueWriteFieldInput)
| 300 | } |
| 301 | |
| 302 | func resolveIssueRequestFieldValues(ctx context.Context, gqlClient *githubv4.Client, owner, repo string, issueFields []issueWriteFieldInput) ([]*github.IssueRequestFieldValue, []int64, error) { |
| 303 | if len(issueFields) == 0 { |
| 304 | return nil, nil, nil |
| 305 | } |
| 306 | |
| 307 | ctxWithFeatures := ghcontext.WithGraphQLFeatures(ctx, "issue_fields", "repo_issue_fields") |
| 308 | var query issueFieldWriteMetadataQuery |
| 309 | vars := map[string]any{ |
| 310 | "owner": githubv4.String(owner), |
| 311 | "repo": githubv4.String(repo), |
| 312 | } |
| 313 | if err := gqlClient.Query(ctxWithFeatures, &query, vars); err != nil { |
| 314 | return nil, nil, fmt.Errorf("failed to query issue fields metadata: %w", err) |
| 315 | } |
| 316 | |
| 317 | // Build name → node map, dispatching on concrete type to extract name. |
| 318 | fieldByName := make(map[string]issueFieldWriteMetadataNode, len(query.Repository.IssueFields.Nodes)) |
| 319 | for _, node := range query.Repository.IssueFields.Nodes { |
| 320 | var name string |
| 321 | switch string(node.TypeName) { |
| 322 | case "IssueFieldText": |
| 323 | name = string(node.IssueFieldText.Name) |
| 324 | case "IssueFieldNumber": |
| 325 | name = string(node.IssueFieldNumber.Name) |
| 326 | case "IssueFieldDate": |
| 327 | name = string(node.IssueFieldDate.Name) |
| 328 | case "IssueFieldSingleSelect": |
| 329 | name = string(node.IssueFieldSingleSelect.Name) |
| 330 | default: |
| 331 | continue |
| 332 | } |
| 333 | fieldByName[strings.ToLower(strings.TrimSpace(name))] = node |
| 334 | } |
| 335 | |
| 336 | resolved := make([]*github.IssueRequestFieldValue, 0, len(issueFields)) |
| 337 | var fieldIDsToDelete []int64 |
| 338 | for _, fieldInput := range issueFields { |
| 339 | node, ok := fieldByName[strings.ToLower(strings.TrimSpace(fieldInput.FieldName))] |
| 340 | if !ok { |
| 341 | return nil, nil, fmt.Errorf("issue field %q was not found in %s/%s", fieldInput.FieldName, owner, repo) |
| 342 | } |
| 343 | |
| 344 | var fullDatabaseIDStr, dataType string |
| 345 | switch string(node.TypeName) { |
| 346 | case "IssueFieldText": |
| 347 | fullDatabaseIDStr = string(node.IssueFieldText.FullDatabaseID) |
| 348 | dataType = string(node.IssueFieldText.DataType) |
| 349 | case "IssueFieldNumber": |
| 350 | fullDatabaseIDStr = string(node.IssueFieldNumber.FullDatabaseID) |
| 351 | dataType = string(node.IssueFieldNumber.DataType) |
| 352 | case "IssueFieldDate": |
| 353 | fullDatabaseIDStr = string(node.IssueFieldDate.FullDatabaseID) |
| 354 | dataType = string(node.IssueFieldDate.DataType) |
| 355 | case "IssueFieldSingleSelect": |
| 356 | fullDatabaseIDStr = string(node.IssueFieldSingleSelect.FullDatabaseID) |
| 357 | dataType = string(node.IssueFieldSingleSelect.DataType) |
| 358 | } |
| 359 |
no test coverage detected