Skip to content

Commit dd92e2e

Browse files
committed
Add an incomplete implementations of CopyFromPango functions
1 parent 85cdc16 commit dd92e2e

File tree

3 files changed

+162
-6
lines changed

3 files changed

+162
-6
lines changed

pkg/translate/terraform_provider/funcs.go

Lines changed: 154 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func generateFromTerraformToPangoParameter(pkgName string, terraformPrefix strin
118118
return specs
119119
}
120120

121-
const copyNestedFromTerraformToPangoStr = `
121+
const copyToPangoTmpl = `
122122
{{- define "terraformNestedElementsAssign" }}
123123
{{- with .Parameter }}
124124
@@ -211,7 +211,138 @@ func (o *{{ .TerraformType }}{{ .ModelOrObject }}) CopyToPango(ctx context.Conte
211211
{{- end }}
212212
`
213213

214-
func CopyNestedFromTerraformToPango(pkgName string, terraformTypePrefix string, property *properties.Normalization) (string, error) {
214+
const copyFromPangoTmpl = `
215+
{{- define "renderFromPangoToTfParameter" }}
216+
{{- if eq .Type "" }}
217+
// TODO: Missing implementation
218+
{{- else }}
219+
// {{ .Name.CamelCase }}: types.{{ .Type | PascalCase }}Value(*elt.{{ .Name.CamelCase }}),
220+
{{- end }}
221+
{{- end }}
222+
223+
{{- define "terraformListElementsAsParam" }}
224+
{{- with .Parameter }}
225+
{{- $pangoType := printf "%s%s" $.Spec.PangoType .Name.CamelCase }}
226+
{{- $terraformType := printf "%s%s%s" $.Spec.TerraformType .Name.CamelCase $.Spec.ModelOrObject }}
227+
{{- $pangoEntries := printf "%s_pango_entries" .Name.LowerCamelCase }}
228+
{{- $tfEntries := printf "%s_tf_entries" .Name.LowerCamelCase }}
229+
{{- if eq .Items.Type "entry" }}
230+
var {{ $tfEntries }} []{{ $terraformType }}
231+
var {{ $pangoEntries }} []{{ $pangoType }}
232+
{
233+
for _, elt := range {{ $pangoEntries }} {
234+
_ = elt // FIXME: remove after we've implemented this code
235+
entry := &{{ $terraformType }} {
236+
{{- range .Spec.Params }}
237+
{{- template "renderFromPangoToTfParameter" . }}
238+
{{- end }}
239+
{{- range .Spec.OneOf }}
240+
{{- template "renderFromPangoToTfParameter" . }}
241+
{{- end }}
242+
}
243+
{{ $tfEntries }} = append({{ $tfEntries }}, *entry)
244+
}
245+
}
246+
{{- else }}
247+
var {{ $pangoEntries }} []{{ .Items.Type }}
248+
{
249+
d := o.{{ .Name.CamelCase }}.ElementsAs(ctx, &{{ $pangoEntries }}, false)
250+
diags.Append(d...)
251+
}
252+
{{- end }}
253+
{{- end }}
254+
{{- end }}
255+
256+
{{- define "terraformListElementsAs" }}
257+
{{- range .Params }}
258+
{{- if eq .Type "list" }}
259+
{{- template "terraformListElementsAsParam" Map "Spec" $ "Parameter" . }}
260+
{{- end }}
261+
{{- end }}
262+
263+
{{- range .OneOf }}
264+
{{- if eq .Type "list" }}
265+
{{- template "terraformListElementsAsParam" Map "Spec" $ "Parameter" . }}
266+
{{- end }}
267+
{{- end }}
268+
{{- end }}
269+
270+
{{- define "terraformCreateEntryAssignmentForParam" }}
271+
{{- with .Parameter }}
272+
273+
{{- $result := .Name.LowerCamelCase }}
274+
{{- $diag := .Name.LowerCamelCase | printf "%s_diags" }}
275+
var {{ $result }}_object *{{ $.Spec.TerraformType }}{{ .Name.CamelCase }}Object
276+
var {{ $diag }} diag.Diagnostics
277+
{{ $result }}_object, {{ $diag }} = o.{{ .Name.CamelCase }}.CopyFromPango(ctx, *obj.{{ .Name.CamelCase }})
278+
diags.Append({{ $diag }}...)
279+
{{- end }}
280+
{{- end }}
281+
282+
{{- define "terraformCreateEntryAssignment" }}
283+
{{- range .Params }}
284+
{{- if eq .Type "" }}
285+
{{- template "terraformCreateEntryAssignmentForParam" Map "Spec" $ "Parameter" . }}
286+
{{- end }}
287+
{{- end }}
288+
289+
{{- range .OneOf }}
290+
{{- if eq .Type "" }}
291+
{{- template "terraformCreateEntryAssignmentForParam" Map "Spec" $ "Parameter" . }}
292+
{{- end }}
293+
{{- end }}
294+
{{- end }}
295+
296+
{{- define "assignFromPangoToTerraform" }}
297+
{{- with .Parameter }}
298+
{{- if eq .Type "" }}
299+
{{ .Name.CamelCase }}: *{{ .Name.LowerCamelCase }}_object,
300+
{{- else if eq .Type "list" }}
301+
// {{ .Name.CamelCase }}: types.ListValueFrom{{ .Name.LowerCamelCase }}_tf_entries,
302+
{{- else }}
303+
{{ .Name.CamelCase }}: types.{{ .Type | PascalCase }}Value(*obj.{{ .Name.CamelCase }}),
304+
{{- end }}
305+
{{- end }}
306+
{{- end }}
307+
308+
{{- range .Specs }}
309+
{{- $spec := . }}
310+
{{ $terraformType := printf "%s%s" .TerraformType .ModelOrObject }}
311+
func (o *{{ $terraformType }}) CopyFromPango(ctx context.Context, obj {{ .PangoReturnType }}) (*{{ $terraformType }}, diag.Diagnostics) {
312+
var diags diag.Diagnostics
313+
{{- template "terraformListElementsAs" $spec }}
314+
{{- template "terraformCreateEntryAssignment" $spec }}
315+
return &{{ $terraformType }}{
316+
{{- range .Params }}
317+
{{- template "assignFromPangoToTerraform" Map "Spec" $spec "Parameter" . }}
318+
{{- end }}
319+
{{- range .OneOf }}
320+
{{- template "assignFromPangoToTerraform" Map "Spec" $spec "Parameter" . }}
321+
{{- end }}
322+
}, diags
323+
}
324+
{{- end }}
325+
`
326+
327+
func pascalCase(value string) string {
328+
var parts []string
329+
if strings.Contains(value, "-") {
330+
parts = strings.Split(value, "-")
331+
} else if strings.Contains(value, "_") {
332+
parts = strings.Split(value, "_")
333+
} else {
334+
parts = []string{value}
335+
}
336+
337+
var result []string
338+
for _, elt := range parts {
339+
result = append(result, strings.Title(elt))
340+
}
341+
342+
return strings.Join(result, "")
343+
}
344+
345+
func RenderCopyToPangoFunctions(pkgName string, terraformTypePrefix string, property *properties.Normalization) (string, error) {
215346
specs := generateFromTerraformToPangoParameter(pkgName, terraformTypePrefix, "", property, "")
216347

217348
type context struct {
@@ -221,7 +352,27 @@ func CopyNestedFromTerraformToPango(pkgName string, terraformTypePrefix string,
221352
data := context{
222353
Specs: specs,
223354
}
224-
return processTemplate(copyNestedFromTerraformToPangoStr, "create-nested-copy-from-tf-to-pango", data, commonFuncMap)
355+
funcMap := mergeFuncMaps(commonFuncMap, template.FuncMap{
356+
"PascalCase": pascalCase,
357+
})
358+
return processTemplate(copyToPangoTmpl, "copy-to-pango", data, funcMap)
359+
}
360+
361+
func RenderCopyFromPangoFunctions(pkgName string, terraformTypePrefix string, property *properties.Normalization) (string, error) {
362+
specs := generateFromTerraformToPangoParameter(pkgName, terraformTypePrefix, "", property, "")
363+
364+
type context struct {
365+
Specs []spec
366+
}
367+
368+
data := context{
369+
Specs: specs,
370+
}
371+
372+
funcMap := mergeFuncMaps(commonFuncMap, template.FuncMap{
373+
"PascalCase": pascalCase,
374+
})
375+
return processTemplate(copyFromPangoTmpl, "copy-from-pango", data, funcMap)
225376
}
226377

227378
func ResourceCreateFunction(structName string, serviceName string, paramSpec *properties.Normalization, terraformProvider *properties.TerraformProviderFile, resourceSDKName string) (string, error) {

pkg/translate/terraform_provider/template.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,9 @@ func (r *{{ structName }}) Configure(ctx context.Context, req resource.Configure
210210
r.client = req.ProviderData.(*pango.Client)
211211
}
212212
213-
{{ CopyNestedFromTerraformToPango }}
213+
{{ RenderCopyToPangoFunctions }}
214+
215+
{{ RenderCopyFromPangoFunctions }}
214216
215217
func (r *{{ structName }}) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
216218
{{ ResourceCreateFunction structName serviceName}}

pkg/translate/terraform_provider/terraform_provider_file.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,11 @@ func (g *GenerateTerraformProvider) GenerateTerraformResource(spec *properties.N
100100
"serviceName": func() string { return names.TfName },
101101
"CreateTfIdStruct": func() (string, error) { return CreateTfIdStruct("entry", spec.GoSdkPath[len(spec.GoSdkPath)-1]) },
102102
"CreateTfIdResourceModel": func() (string, error) { return CreateTfIdResourceModel("entry", names.StructName) },
103-
"CopyNestedFromTerraformToPango": func() (string, error) {
104-
return CopyNestedFromTerraformToPango(spec.GoSdkPath[len(spec.GoSdkPath)-1], names.StructName, spec)
103+
"RenderCopyToPangoFunctions": func() (string, error) {
104+
return RenderCopyToPangoFunctions(spec.GoSdkPath[len(spec.GoSdkPath)-1], names.StructName, spec)
105+
},
106+
"RenderCopyFromPangoFunctions": func() (string, error) {
107+
return RenderCopyFromPangoFunctions(spec.GoSdkPath[len(spec.GoSdkPath)-1], names.StructName, spec)
105108
},
106109
"ResourceCreateFunction": func(structName string, serviceName string) (string, error) {
107110
return ResourceCreateFunction(structName, serviceName, spec, terraformProvider, spec.GoSdkPath[len(spec.GoSdkPath)-1])

0 commit comments

Comments
 (0)