Skip to content

Commit befe39b

Browse files
committed
Implement CopyToPango() on all terraform models and objects
This replaces existing CopyFromTerraformToPango* functions.
1 parent 627d8fb commit befe39b

File tree

2 files changed

+111
-79
lines changed

2 files changed

+111
-79
lines changed

pkg/translate/terraform_provider/funcs.go

Lines changed: 111 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -21,69 +21,100 @@ type EntryData struct {
2121
}
2222

2323
type spec struct {
24-
Name string
25-
ParentFunctionSuffix string
26-
FunctionSuffix string
27-
PangoType string
28-
TerraformType string
29-
Params map[string]*properties.SpecParam
30-
OneOf map[string]*properties.SpecParam
24+
Name string
25+
PangoType string
26+
PangoReturnType string
27+
TerraformType string
28+
ModelOrObject string
29+
Params map[string]*properties.SpecParam
30+
OneOf map[string]*properties.SpecParam
3131
}
3232

3333
func getReturnPangoTypeForProperty(pkgName string, parent string, prop *properties.SpecParam) string {
3434
if prop.Type == "" {
35-
return fmt.Sprintf("%s.%s%s", pkgName, parent, prop.Name.CamelCase)
35+
return fmt.Sprintf("%s.%s", pkgName, parent)
3636
} else if prop.Type == "list" {
37-
if prop.Items.Type == "" {
38-
return fmt.Sprintf("[]%s.%s%s", pkgName, parent, prop.Name.CamelCase)
37+
if prop.Items.Type == "entry" {
38+
return fmt.Sprintf("%s.%s", pkgName, parent)
3939
} else {
40-
return fmt.Sprintf("[]%s.%s%s", pkgName, parent, prop.Type)
40+
return fmt.Sprintf("%s.%s", pkgName, parent)
4141
}
4242
} else {
4343
if prop.Required {
44-
return fmt.Sprintf("%s.%s%s", pkgName, parent, prop.Type)
44+
return fmt.Sprintf("%s.%s", pkgName, parent)
4545
} else {
46-
return fmt.Sprintf("%s.%s%s", pkgName, parent, prop.Type)
46+
return fmt.Sprintf("%s.%s", pkgName, parent)
4747
}
4848
}
4949
}
5050

51-
func generateFromTerraformToPangoSpec(pkgName string, structName string, parent string, prop *properties.SpecParam) []spec {
51+
func generateFromTerraformToPangoSpec(pangoTypePrefix string, terraformPrefix string, paramSpec *properties.SpecParam) []spec {
52+
if paramSpec.Spec == nil {
53+
return nil
54+
}
55+
5256
var specs []spec
53-
if prop.Type == "" {
54-
name := fmt.Sprintf("%s", prop.Name.CamelCase)
55-
terraformType := fmt.Sprintf("%s%s%sObject", structName, parent, prop.Name.CamelCase)
56-
returnType := getReturnPangoTypeForProperty(pkgName, parent, prop)
57-
58-
var params map[string]*properties.SpecParam
59-
var variants map[string]*properties.SpecParam
60-
if prop.Type == "" {
61-
params = prop.Spec.Params
62-
variants = prop.Spec.OneOf
63-
}
6457

65-
specs = append(specs, spec{
66-
Name: name,
67-
TerraformType: terraformType,
68-
PangoType: returnType,
69-
ParentFunctionSuffix: fmt.Sprintf("%s%s", structName, parent),
70-
FunctionSuffix: fmt.Sprintf("%s%s", structName, name),
71-
Params: params,
72-
OneOf: variants,
73-
})
74-
75-
if prop.Type == "" {
76-
parent += name
77-
for _, p := range params {
78-
specs = append(specs, generateFromTerraformToPangoSpec(pkgName, structName, parent, p)...)
79-
}
58+
pangoType := fmt.Sprintf("%s%s", pangoTypePrefix, paramSpec.Name.CamelCase)
59+
60+
pangoReturnType := fmt.Sprintf("%s%s", pangoTypePrefix, paramSpec.Name.CamelCase)
61+
terraformType := fmt.Sprintf("%s%s", terraformPrefix, paramSpec.Name.CamelCase)
62+
element := spec{
63+
PangoType: pangoType,
64+
PangoReturnType: pangoReturnType,
65+
TerraformType: terraformType,
66+
ModelOrObject: "Object",
67+
Params: paramSpec.Spec.Params,
68+
OneOf: paramSpec.Spec.OneOf,
69+
}
70+
specs = append(specs, element)
71+
log.Printf("generateFromTerraformToPangoSpec() spec: %v", element)
8072

81-
for _, p := range variants {
82-
specs = append(specs, generateFromTerraformToPangoSpec(pkgName, structName, parent, p)...)
73+
renderSpecsForParams := func(params map[string]*properties.SpecParam) {
74+
for _, elt := range params {
75+
if elt.Spec == nil {
76+
continue
8377
}
78+
terraformPrefix := fmt.Sprintf("%s%s", terraformPrefix, paramSpec.Name.CamelCase)
79+
log.Printf("Element: %s, pangoType: %s, terraformPrefix: %s", elt.Name.CamelCase, pangoType, terraformPrefix)
80+
specs = append(specs, generateFromTerraformToPangoSpec(pangoType, terraformPrefix, elt)...)
8481
}
82+
}
83+
84+
renderSpecsForParams(paramSpec.Spec.Params)
85+
renderSpecsForParams(paramSpec.Spec.OneOf)
86+
87+
return specs
88+
}
89+
90+
func generateFromTerraformToPangoParameter(pkgName string, terraformPrefix string, pangoPrefix string, prop *properties.Normalization, parentName string) []spec {
91+
var specs []spec
92+
93+
var pangoReturnType string
94+
if parentName == "" {
95+
pangoReturnType = fmt.Sprintf("%s.Entry", pkgName)
96+
pangoPrefix = fmt.Sprintf("%s.", pkgName)
97+
} else {
98+
pangoReturnType = fmt.Sprintf("%s.%s", pkgName, parentName)
99+
}
100+
101+
specs = append(specs, spec{
102+
PangoType: pangoPrefix,
103+
PangoReturnType: pangoReturnType,
104+
ModelOrObject: "Model",
105+
TerraformType: terraformPrefix,
106+
Params: prop.Spec.Params,
107+
OneOf: prop.Spec.OneOf,
108+
})
109+
110+
for _, elt := range prop.Spec.Params {
111+
specs = append(specs, generateFromTerraformToPangoSpec(pangoPrefix, terraformPrefix, elt)...)
112+
}
85113

114+
for _, elt := range prop.Spec.OneOf {
115+
specs = append(specs, generateFromTerraformToPangoSpec(pangoPrefix, terraformPrefix, elt)...)
86116
}
117+
87118
return specs
88119
}
89120

@@ -93,79 +124,92 @@ const copyNestedFromTerraformToPangoStr = `
93124
94125
{{- $result := .Name.LowerCamelCase }}
95126
{{- $diag := .Name.LowerCamelCase | printf "%s_diags" }}
96-
97-
var {{ $result }} *{{ $.Parent }}{{ .Name.CamelCase }}
127+
var {{ $result }}_entry *{{ $.Spec.PangoType }}{{ .Name.CamelCase }}
98128
var {{ $diag }} diag.Diagnostics
99-
{{ $result }}, {{ $diag }} = {{ $.CopyFunction }}
129+
{{ $result }}_entry, {{ $diag }} = o.{{ .Name.CamelCase }}.CopyToPango(ctx)
100130
diags.Append({{ $diag }}...)
101131
102132
{{- end }}
103133
{{- end }}
104134
105135
{{- define "terraformListElementsAs" }}
106136
{{- with .Parameter }}
137+
{{- $pangoType := printf "%s%s" $.Spec.PangoType .Name.CamelCase }}
138+
{{- $terraformType := printf "%s%s%s" $.Spec.TerraformType .Name.CamelCase $.Spec.ModelOrObject }}
139+
{{- $pangoEntries := printf "%s_pango_entries" .Name.LowerCamelCase }}
140+
{{- $tfEntries := printf "%s_tf_entries" .Name.LowerCamelCase }}
107141
{{- if eq .Items.Type "entry" }}
108-
var {{ .Name.LowerCamelCase }}_elements []{{ .Name.CamelCase }}
142+
var {{ $tfEntries }} []{{ $terraformType }}
143+
var {{ $pangoEntries }} []{{ $pangoType }}
144+
{
145+
d := o.{{ .Name.CamelCase }}.ElementsAs(ctx, &{{ $tfEntries }}, false)
146+
diags.Append(d...)
147+
for _, elt := range {{ $tfEntries }} {
148+
entry, d := elt.CopyToPango(ctx)
149+
diags.Append(d...)
150+
{{ $pangoEntries }} = append({{ $pangoEntries }}, *entry)
151+
}
152+
}
109153
{{- else }}
110-
var {{ .Name.LowerCamelCase }}_elements []{{ .Items.Type }}
111-
{{- end }}
154+
var {{ $pangoEntries }} []{{ .Items.Type }}
112155
{
113-
d := obj.{{ .Name.CamelCase }}.ElementsAs(ctx, &{{ .Name.LowerCamelCase }}_elements, false)
156+
d := o.{{ .Name.CamelCase }}.ElementsAs(ctx, &{{ $pangoEntries }}, false)
114157
diags.Append(d...)
115158
}
159+
{{- end }}
116160
{{- end }}
117161
{{- end }}
118162
119163
{{- range .Specs }}
120164
{{- $spec := . }}
121-
func CopyFromTerraformToPango{{ .ParentFunctionSuffix }}{{ .Name }}(ctx context.Context, obj {{ .TerraformType }}) (*{{ .PangoType }}, diag.Diagnostics) {
165+
func (o *{{ .TerraformType }}{{ .ModelOrObject }}) CopyToPango(ctx context.Context) (*{{ .PangoReturnType }}, diag.Diagnostics) {
122166
var diags diag.Diagnostics
123167
{{- range .Params }}
168+
{{- $terraformType := printf "%s%s" $spec.TerraformType .Name.CamelCase }}
124169
{{- if eq .Type "" }}
125-
{{- $copyFn := printf "CopyFromTerraformToPango%s%s%s(ctx, obj.%s)" $spec.ParentFunctionSuffix $spec.Name .Name.CamelCase .Name.CamelCase }}
126-
{{- template "terraformNestedElementsAssign" Map "Parameter" . "CopyFunction" $copyFn "Parent" $spec.PangoType }}
170+
{{- $pangoType := printf "%sObject" $spec.PangoType }}
171+
{{- template "terraformNestedElementsAssign" Map "Parameter" . "Spec" $spec }}
127172
{{- else if eq .Type "list" }}
128-
{{- $copyFn := printf "COPY LIST LOL(obj.%s)" .Name.CamelCase }}
129-
{{- template "terraformListElementsAs" Map "Parameter" . "CopyFunction" $copyFn }}
173+
{{- $pangoType := printf "%s%s" $spec.PangoType .Name.CamelCase }}
174+
{{- template "terraformListElementsAs" Map "Parameter" . "Spec" $spec }}
130175
{{- end }}
131176
{{- end }}
132177
133178
{{- range .OneOf }}
134179
{{- if eq .Type "" }}
135-
{{- $copyFn := printf "CopyFromTerraformToPango%s%s%s(ctx, obj.%s)" $spec.ParentFunctionSuffix $spec.Name .Name.CamelCase .Name.CamelCase }}
136-
{{- template "terraformNestedElementsAssign" Map "Parameter" . "CopyFunction" $copyFn "Parent" $spec.PangoType }}
180+
{{- $pangoType := printf "%sObject" $spec.PangoType }}
181+
{{- template "terraformNestedElementsAssign" Map "Parameter" . "Spec" $spec }}
137182
{{- else if eq .Type "list" }}
138-
{{- $copyFn := printf "COPY LIST LOL(obj.%s)" .Name.CamelCase }}
139-
{{- template "terraformListElementsAs" Map "Parameter" . "CopyFunction" $copyFn }}
183+
{{- template "terraformListElementsAs" Map "Parameter" . "Spec" $spec }}
140184
{{- end }}
141185
{{- end }}
142186
143-
result := &{{ .PangoType }}{
187+
result := &{{ .PangoReturnType }}{
144188
{{- range .Params }}
145189
{{- if eq .Type "" }}
146-
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }},
190+
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_entry,
147191
{{- else if eq .Type "list" }}
148192
{{- if eq .Items.Type "object" }}
149193
// TODO: List objects {{ .Name.CamelCase }},
150194
{{- else }}
151-
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_elements,
195+
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_pango_entries,
152196
{{- end }}
153197
{{- else }}
154-
{{ .Name.CamelCase }}: obj.{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
198+
{{ .Name.CamelCase }}: o.{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
155199
{{- end }}
156200
{{- end }}
157201
158202
{{- range .OneOf }}
159203
{{- if eq .Type "" }}
160-
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }},
204+
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_entry,
161205
{{- else if eq .Type "list" }}
162206
{{- if eq .Items.Type "object" }}
163207
// TODO: List objects {{ .Name.CamelCase }},
164208
{{- else }}
165-
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_elements,
209+
{{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_pango_entries,
166210
{{- end }}
167211
{{- else }}
168-
{{ .Name.CamelCase }}: obj.{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
212+
{{ .Name.CamelCase }}: o.{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
169213
{{- end }}
170214
{{- end }}
171215
}
@@ -175,19 +219,8 @@ func CopyFromTerraformToPango{{ .ParentFunctionSuffix }}{{ .Name }}(ctx context.
175219
{{- end }}
176220
`
177221

178-
func CopyNestedFromTerraformToPango(pkgName string, structName string, props *properties.Normalization) (string, error) {
179-
var specs []spec
180-
for _, elt := range props.Spec.Params {
181-
if elt.Type == "" {
182-
specs = append(specs, generateFromTerraformToPangoSpec(pkgName, structName, "", elt)...)
183-
}
184-
}
185-
186-
for _, elt := range props.Spec.OneOf {
187-
if elt.Type == "" {
188-
specs = append(specs, generateFromTerraformToPangoSpec(pkgName, structName, "", elt)...)
189-
}
190-
}
222+
func CopyNestedFromTerraformToPango(pkgName string, terraformTypePrefix string, property *properties.Normalization) (string, error) {
223+
specs := generateFromTerraformToPangoParameter(pkgName, terraformTypePrefix, "", property, "")
191224

192225
type context struct {
193226
Specs []spec

pkg/translate/terraform_provider/template.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ func (r *{{ structName }}) Metadata(ctx context.Context, req resource.MetadataRe
183183
}
184184
185185
func (r *{{ structName }}) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) {
186-
// TODO: Fill schema via function
187186
resp.Schema = rsschema.Schema{
188187
Description: "",
189188
Attributes: map[string]rsschema.Attribute{

0 commit comments

Comments
 (0)