parseComponentYAML parses and validates a ComponentYAML. It is separated from parseComponent to allow inline creation of components from a canvas YAML file.
(tmp *ComponentYAML)
| 81 | // parseComponentYAML parses and validates a ComponentYAML. |
| 82 | // It is separated from parseComponent to allow inline creation of components from a canvas YAML file. |
| 83 | func (p *Parser) parseComponentYAML(tmp *ComponentYAML) (*runtimev1.ComponentSpec, []ResourceName, error) { |
| 84 | // Display name backwards compatibility |
| 85 | if tmp.Title != "" && tmp.DisplayName == "" { |
| 86 | tmp.DisplayName = tmp.Title |
| 87 | } |
| 88 | |
| 89 | // Description backwards compatibility |
| 90 | if tmp.Subtitle != "" && tmp.Description == "" { |
| 91 | tmp.Description = tmp.Subtitle |
| 92 | } |
| 93 | |
| 94 | // Discover and validate the renderer |
| 95 | n := 0 |
| 96 | var renderer string |
| 97 | var rendererProps *structpb.Struct |
| 98 | if len(tmp.Other) == 1 { |
| 99 | n++ |
| 100 | var props map[string]any |
| 101 | for renderer, props = range tmp.Other { |
| 102 | break |
| 103 | } |
| 104 | |
| 105 | propsPB, err := structpb.NewStruct(props) |
| 106 | if err != nil { |
| 107 | return nil, nil, fmt.Errorf(`failed to convert property %q to struct: %w`, renderer, err) |
| 108 | } |
| 109 | |
| 110 | rendererProps = propsPB |
| 111 | } else { |
| 112 | n += len(tmp.Other) |
| 113 | } |
| 114 | |
| 115 | // Check there is exactly one renderer |
| 116 | if n == 0 { |
| 117 | return nil, nil, errors.New(`missing renderer configuration`) |
| 118 | } |
| 119 | if n > 1 { |
| 120 | return nil, nil, errors.New(`multiple renderers are not allowed`) |
| 121 | } |
| 122 | |
| 123 | // We generally treat the renderer props as untyped, but since "metrics_view" is a very common field, |
| 124 | // and adding it to refs generally makes for nicer error messages, we specifically search for and link it here. |
| 125 | var refs []ResourceName |
| 126 | if rendererProps != nil { |
| 127 | for k, v := range rendererProps.Fields { |
| 128 | if k == "metrics_view" { |
| 129 | name := v.GetStringValue() |
| 130 | if name != "" { |
| 131 | refs = append(refs, ResourceName{Kind: ResourceKindMetricsView, Name: name}) |
| 132 | } |
| 133 | break |
| 134 | } |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | // Parse input variables |
| 139 | var input []*runtimev1.ComponentVariable |
| 140 | if len(tmp.Input) > 0 { |
no test coverage detected