Skip to content

Commit 0dffe9d

Browse files
committed
feat: implement comprehensive OpenAPI discriminator pattern support
1 parent 458cef1 commit 0dffe9d

File tree

6 files changed

+293
-28
lines changed

6 files changed

+293
-28
lines changed

internal/cmd/generate.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"github.com/hashicorp/cli"
2222
"github.com/pb33f/libopenapi"
23+
high "github.com/pb33f/libopenapi/datamodel/high/v3"
2324
"github.com/pb33f/libopenapi/index"
2425
)
2526

@@ -148,7 +149,7 @@ func (cmd *GenerateCommand) runInternal(logger *slog.Logger) error {
148149

149150
// 5. Generate provider code spec w/ config
150151
oasExplorer := explorer.NewConfigExplorer(model.Model, *config)
151-
providerCodeSpec, err := generateProviderCodeSpec(logger, oasExplorer, *config)
152+
providerCodeSpec, err := generateProviderCodeSpec(logger, oasExplorer, &model.Model, *config)
152153
if err != nil {
153154
return err
154155
}
@@ -181,7 +182,7 @@ func (cmd *GenerateCommand) runInternal(logger *slog.Logger) error {
181182
return nil
182183
}
183184

184-
func generateProviderCodeSpec(logger *slog.Logger, dora explorer.Explorer, cfg config.Config) (*spec.Specification, error) {
185+
func generateProviderCodeSpec(logger *slog.Logger, dora explorer.Explorer, document *high.Document, cfg config.Config) (*spec.Specification, error) {
185186
// 1. Find TF resources in OAS
186187
explorerResources, err := dora.FindResources()
187188
if err != nil {
@@ -201,21 +202,21 @@ func generateProviderCodeSpec(logger *slog.Logger, dora explorer.Explorer, cfg c
201202
}
202203

203204
// 4. Use TF info to generate provider code spec for resources
204-
resourceMapper := mapper.NewResourceMapper(explorerResources, cfg)
205+
resourceMapper := mapper.NewResourceMapper(explorerResources, document, cfg)
205206
resourcesIR, err := resourceMapper.MapToIR(logger)
206207
if err != nil {
207208
return nil, fmt.Errorf("error generating provider code spec for resources: %w", err)
208209
}
209210

210211
// 5. Use TF info to generate provider code spec for data sources
211-
dataSourceMapper := mapper.NewDataSourceMapper(explorerDataSources, cfg)
212+
dataSourceMapper := mapper.NewDataSourceMapper(explorerDataSources, document, cfg)
212213
dataSourcesIR, err := dataSourceMapper.MapToIR(logger)
213214
if err != nil {
214215
return nil, fmt.Errorf("error generating provider code spec for data sources: %w", err)
215216
}
216217

217218
// 6. Use TF info to generate provider code spec for provider
218-
providerMapper := mapper.NewProviderMapper(explorerProvider, cfg)
219+
providerMapper := mapper.NewProviderMapper(explorerProvider, document, cfg)
219220
providerIR, err := providerMapper.MapToIR(logger)
220221
if err != nil {
221222
return nil, fmt.Errorf("error generating provider code spec for provider: %w", err)

internal/mapper/datasource_mapper.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/hashicorp/terraform-plugin-codegen-openapi/internal/mapper/util"
1616
"github.com/hashicorp/terraform-plugin-codegen-spec/datasource"
1717
"github.com/hashicorp/terraform-plugin-codegen-spec/schema"
18+
high "github.com/pb33f/libopenapi/datamodel/high/v3"
1819
)
1920

2021
var _ DataSourceMapper = dataSourceMapper{}
@@ -25,13 +26,15 @@ type DataSourceMapper interface {
2526

2627
type dataSourceMapper struct {
2728
dataSources map[string]explorer.DataSource
29+
document *high.Document
2830
//nolint:unused // Might be useful later!
2931
cfg config.Config
3032
}
3133

32-
func NewDataSourceMapper(dataSources map[string]explorer.DataSource, cfg config.Config) DataSourceMapper {
34+
func NewDataSourceMapper(dataSources map[string]explorer.DataSource, document *high.Document, cfg config.Config) DataSourceMapper {
3335
return dataSourceMapper{
3436
dataSources: dataSources,
37+
document: document,
3538
cfg: cfg,
3639
}
3740
}
@@ -45,7 +48,7 @@ func (m dataSourceMapper) MapToIR(logger *slog.Logger) ([]datasource.DataSource,
4548
dataSource := m.dataSources[name]
4649
dLogger := logger.With("data_source", name)
4750

48-
schema, err := generateDataSourceSchema(dLogger, name, dataSource)
51+
schema, err := generateDataSourceSchema(dLogger, name, dataSource, m.document)
4952
if err != nil {
5053
log.WarnLogOnError(dLogger, err, "skipping data source schema mapping")
5154
continue
@@ -60,7 +63,7 @@ func (m dataSourceMapper) MapToIR(logger *slog.Logger) ([]datasource.DataSource,
6063
return dataSourceSchemas, nil
6164
}
6265

63-
func generateDataSourceSchema(logger *slog.Logger, name string, dataSource explorer.DataSource) (*datasource.Schema, error) {
66+
func generateDataSourceSchema(logger *slog.Logger, name string, dataSource explorer.DataSource, document *high.Document) (*datasource.Schema, error) {
6467
dataSourceSchema := &datasource.Schema{
6568
Attributes: []datasource.Attribute{},
6669
}
@@ -75,6 +78,7 @@ func generateDataSourceSchema(logger *slog.Logger, name string, dataSource explo
7578
}
7679
globalSchemaOpts := oas.GlobalSchemaOpts{
7780
OverrideComputability: schema.Computed,
81+
Document: document,
7882
}
7983
readResponseSchema, err := oas.BuildSchemaFromResponse(dataSource.ReadOp, schemaOpts, globalSchemaOpts)
8084
if err != nil {
@@ -118,7 +122,9 @@ func generateDataSourceSchema(logger *slog.Logger, name string, dataSource explo
118122
OverrideDescription: param.Description,
119123
}
120124

121-
s, schemaErr := oas.BuildSchema(param.Schema, schemaOpts, oas.GlobalSchemaOpts{})
125+
s, schemaErr := oas.BuildSchema(param.Schema, schemaOpts, oas.GlobalSchemaOpts{
126+
Document: document,
127+
})
122128
if schemaErr != nil {
123129
log.WarnLogOnError(pLogger, schemaErr, "skipping mapping of read operation parameter")
124130
continue

0 commit comments

Comments
 (0)