@@ -21,69 +21,100 @@ type EntryData struct {
21
21
}
22
22
23
23
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
31
31
}
32
32
33
33
func getReturnPangoTypeForProperty (pkgName string , parent string , prop * properties.SpecParam ) string {
34
34
if prop .Type == "" {
35
- return fmt .Sprintf ("%s.%s%s " , pkgName , parent , prop . Name . CamelCase )
35
+ return fmt .Sprintf ("%s.%s" , pkgName , parent )
36
36
} 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 )
39
39
} else {
40
- return fmt .Sprintf ("[] %s.%s%s " , pkgName , parent , prop . Type )
40
+ return fmt .Sprintf ("%s.%s" , pkgName , parent )
41
41
}
42
42
} else {
43
43
if prop .Required {
44
- return fmt .Sprintf ("%s.%s%s " , pkgName , parent , prop . Type )
44
+ return fmt .Sprintf ("%s.%s" , pkgName , parent )
45
45
} else {
46
- return fmt .Sprintf ("%s.%s%s " , pkgName , parent , prop . Type )
46
+ return fmt .Sprintf ("%s.%s" , pkgName , parent )
47
47
}
48
48
}
49
49
}
50
50
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
+
52
56
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
- }
64
57
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 )
80
72
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
83
77
}
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 )... )
84
81
}
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
+ }
85
113
114
+ for _ , elt := range prop .Spec .OneOf {
115
+ specs = append (specs , generateFromTerraformToPangoSpec (pangoPrefix , terraformPrefix , elt )... )
86
116
}
117
+
87
118
return specs
88
119
}
89
120
@@ -93,79 +124,92 @@ const copyNestedFromTerraformToPangoStr = `
93
124
94
125
{{- $result := .Name.LowerCamelCase }}
95
126
{{- $diag := .Name.LowerCamelCase | printf "%s_diags" }}
96
-
97
- var {{ $result }} *{{ $.Parent }}{{ .Name.CamelCase }}
127
+ var {{ $result }}_entry *{{ $.Spec.PangoType }}{{ .Name.CamelCase }}
98
128
var {{ $diag }} diag.Diagnostics
99
- {{ $result }}, {{ $diag }} = {{ $.CopyFunction }}
129
+ {{ $result }}_entry , {{ $diag }} = o. {{ .Name.CamelCase }}.CopyToPango(ctx)
100
130
diags.Append({{ $diag }}...)
101
131
102
132
{{- end }}
103
133
{{- end }}
104
134
105
135
{{- define "terraformListElementsAs" }}
106
136
{{- 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 }}
107
141
{{- 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
+ }
109
153
{{- else }}
110
- var {{ .Name.LowerCamelCase }}_elements []{{ .Items.Type }}
111
- {{- end }}
154
+ var {{ $pangoEntries }} []{{ .Items.Type }}
112
155
{
113
- d := obj .{{ .Name.CamelCase }}.ElementsAs(ctx, &{{ .Name.LowerCamelCase }}_elements , false)
156
+ d := o .{{ .Name.CamelCase }}.ElementsAs(ctx, &{{ $pangoEntries }}, false)
114
157
diags.Append(d...)
115
158
}
159
+ {{- end }}
116
160
{{- end }}
117
161
{{- end }}
118
162
119
163
{{- range .Specs }}
120
164
{{- $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) {
122
166
var diags diag.Diagnostics
123
167
{{- range .Params }}
168
+ {{- $terraformType := printf "%s%s" $spec.TerraformType .Name.CamelCase }}
124
169
{{- 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 }}
127
172
{{- 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 }}
130
175
{{- end }}
131
176
{{- end }}
132
177
133
178
{{- range .OneOf }}
134
179
{{- 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 }}
137
182
{{- 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 }}
140
184
{{- end }}
141
185
{{- end }}
142
186
143
- result := &{{ .PangoType }}{
187
+ result := &{{ .PangoReturnType }}{
144
188
{{- range .Params }}
145
189
{{- if eq .Type "" }}
146
- {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }},
190
+ {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_entry ,
147
191
{{- else if eq .Type "list" }}
148
192
{{- if eq .Items.Type "object" }}
149
193
// TODO: List objects {{ .Name.CamelCase }},
150
194
{{- else }}
151
- {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_elements ,
195
+ {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_pango_entries ,
152
196
{{- end }}
153
197
{{- else }}
154
- {{ .Name.CamelCase }}: obj .{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
198
+ {{ .Name.CamelCase }}: o .{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
155
199
{{- end }}
156
200
{{- end }}
157
201
158
202
{{- range .OneOf }}
159
203
{{- if eq .Type "" }}
160
- {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }},
204
+ {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_entry ,
161
205
{{- else if eq .Type "list" }}
162
206
{{- if eq .Items.Type "object" }}
163
207
// TODO: List objects {{ .Name.CamelCase }},
164
208
{{- else }}
165
- {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_elements ,
209
+ {{ .Name.CamelCase }}: {{ .Name.LowerCamelCase }}_pango_entries ,
166
210
{{- end }}
167
211
{{- else }}
168
- {{ .Name.CamelCase }}: obj .{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
212
+ {{ .Name.CamelCase }}: o .{{ .Name.CamelCase }}.Value{{ CamelCaseType .Type }}Pointer(),
169
213
{{- end }}
170
214
{{- end }}
171
215
}
@@ -175,19 +219,8 @@ func CopyFromTerraformToPango{{ .ParentFunctionSuffix }}{{ .Name }}(ctx context.
175
219
{{- end }}
176
220
`
177
221
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 , "" )
191
224
192
225
type context struct {
193
226
Specs []spec
0 commit comments