diff --git a/cmd/cli/loaders/openapi.go b/cmd/cli/loaders/openapi.go index 64ab39037..c111a520a 100644 --- a/cmd/cli/loaders/openapi.go +++ b/cmd/cli/loaders/openapi.go @@ -12,7 +12,10 @@ func openapiLoader(opts Options) ([]*ast.Schema, error) { for _, entrypoint := range opts.OpenAPIEntrypoints { pkg := filepath.Base(filepath.Dir(entrypoint)) schemaAst, err := openapi.GenerateAST(entrypoint, openapi.Config{ - Package: pkg, + Package: pkg, + SchemaMetadata: ast.SchemaMeta{ + // TODO: extract these from somewhere + }, }) if err != nil { return nil, err diff --git a/internal/openapi/generator.go b/internal/openapi/generator.go index 07ee69cff..57e6b22c2 100644 --- a/internal/openapi/generator.go +++ b/internal/openapi/generator.go @@ -23,7 +23,8 @@ const ( ) type Config struct { - Package string + Package string + SchemaMetadata ast.SchemaMeta } type generator struct { @@ -42,7 +43,10 @@ func GenerateAST(filePath string, cfg Config) (*ast.Schema, error) { } g := &generator{ - file: &ast.Schema{Package: cfg.Package}, + file: &ast.Schema{ + Package: cfg.Package, + Metadata: cfg.SchemaMetadata, + }, } if oapi.Components == nil { diff --git a/internal/veneers/builder/actions.go b/internal/veneers/builder/actions.go index d91275885..a5ec2d3b5 100644 --- a/internal/veneers/builder/actions.go +++ b/internal/veneers/builder/actions.go @@ -50,3 +50,9 @@ func MergeIntoAction(sourceBuilderName string, underPath string, excludeOptions return newBuilder } } + +func ComposeDashboardPanelAction(_ /*panelBuilderName*/ string) RewriteAction { + return func(builders ast.Builders, destinationBuilder ast.Builder) ast.Builder { + return destinationBuilder + } +} diff --git a/internal/veneers/builder/rules.go b/internal/veneers/builder/rules.go index 82747607b..2d96abb89 100644 --- a/internal/veneers/builder/rules.go +++ b/internal/veneers/builder/rules.go @@ -18,3 +18,10 @@ func MergeInto(selector Selector, sourceBuilderName string, underPath string, ex Action: MergeIntoAction(sourceBuilderName, underPath, excludeOptions), } } + +func ComposeDashboardPanel(selector Selector, sourceBuilderName string) RewriteRule { + return RewriteRule{ + Selector: selector, + Action: ComposeDashboardPanelAction(sourceBuilderName), + } +} diff --git a/internal/veneers/builder/selectors.go b/internal/veneers/builder/selectors.go index 05e5f59f3..4eb11bbd5 100644 --- a/internal/veneers/builder/selectors.go +++ b/internal/veneers/builder/selectors.go @@ -22,6 +22,14 @@ func StructGeneratedFromDisjunction() Selector { } } +func ComposableDashboardPanel() Selector { + return func(builder ast.Builder) bool { + return builder.Schema.Metadata.Kind == ast.SchemaKindComposable && + builder.Schema.Metadata.Variant == ast.SchemaVariantPanel && + builder.Schema.Metadata.Identifier != "" + } +} + func EveryBuilder() Selector { return func(builder ast.Builder) bool { return true diff --git a/internal/veneers/veneers.go b/internal/veneers/veneers.go index c916bbe3d..8d994a647 100644 --- a/internal/veneers/veneers.go +++ b/internal/veneers/veneers.go @@ -31,6 +31,12 @@ func Common() *Rewriter { }, ), + // Panels composability + builder.ComposeDashboardPanel( + builder.ComposableDashboardPanel(), + "dashboard.Panel", + ), + // remove builders that were previously merged into something else builder.Omit(builder.ByName("FieldConfig")), builder.Omit(builder.ByName("FieldConfigSource")),