parseYAMLRefs parses a list of YAML nodes into a list of ResourceNames. It's used to parse the "refs" field in baseConfig.
(refs []yaml.Node)
| 377 | // parseYAMLRefs parses a list of YAML nodes into a list of ResourceNames. |
| 378 | // It's used to parse the "refs" field in baseConfig. |
| 379 | func parseYAMLRefs(refs []yaml.Node) ([]ResourceName, error) { |
| 380 | var res []ResourceName |
| 381 | for i := range refs { |
| 382 | ref := refs[i] |
| 383 | |
| 384 | // We support string refs of the form "my-resource" and "Kind/my-resource" |
| 385 | if ref.Kind == yaml.ScalarNode { |
| 386 | var identifier string |
| 387 | err := ref.Decode(&identifier) |
| 388 | if err != nil { |
| 389 | return nil, fmt.Errorf("invalid refs: %v", ref) |
| 390 | } |
| 391 | |
| 392 | // Parse name and kind from identifier |
| 393 | parts := strings.Split(identifier, "/") |
| 394 | if len(parts) != 1 && len(parts) != 2 { |
| 395 | return nil, fmt.Errorf("invalid refs: invalid identifier %q", identifier) |
| 396 | } |
| 397 | |
| 398 | var name ResourceName |
| 399 | if len(parts) == 1 { |
| 400 | name.Name = parts[0] |
| 401 | } else { |
| 402 | // Kind and name specified |
| 403 | kind, err := ParseResourceKind(parts[0]) |
| 404 | if err != nil { |
| 405 | return nil, fmt.Errorf("invalid refs: %w", err) |
| 406 | } |
| 407 | name.Kind = kind |
| 408 | name.Name = parts[1] |
| 409 | } |
| 410 | res = append(res, name) |
| 411 | continue |
| 412 | } |
| 413 | |
| 414 | // We support map refs of the form { type: "kind", name: "my-resource" } |
| 415 | if ref.Kind == yaml.MappingNode { |
| 416 | m := make(map[string]string) |
| 417 | err := ref.Decode(m) |
| 418 | if err != nil { |
| 419 | return nil, fmt.Errorf("invalid refs: %w", err) |
| 420 | } |
| 421 | if m["name"] == "" { |
| 422 | return nil, errors.New(`an object ref must provide the properties "type" and "name" properties`) |
| 423 | } |
| 424 | |
| 425 | var name ResourceName |
| 426 | name.Name = m["name"] |
| 427 | |
| 428 | if m["type"] != "" { |
| 429 | kind, err := ParseResourceKind(m["type"]) |
| 430 | if err != nil { |
| 431 | return nil, fmt.Errorf("invalid refs: %w", err) |
| 432 | } |
| 433 | name.Kind = kind |
| 434 | } |
| 435 | |
| 436 | // Backwards compatibility for "kind:" changed to "type:" |
no test coverage detected