@@ -30,7 +30,7 @@ type spec struct {
30
30
OneOf map [string ]* properties.SpecParam
31
31
}
32
32
33
- func getReturnPangoTypeForProperty (pkgName string , parent string , prop * properties.SpecParam ) string {
33
+ func returnPangoTypeForProperty (pkgName string , parent string , prop * properties.SpecParam ) string {
34
34
if prop .Type == "" {
35
35
return fmt .Sprintf ("%s.%s" , pkgName , parent )
36
36
} else if prop .Type == "list" {
@@ -675,6 +675,139 @@ func RenderLocationsStateToPango(names *NameProvider, spec *properties.Normaliza
675
675
return processTemplate (locationsStateToPango , "render-locations-state-to-pango" , data , commonFuncMap )
676
676
}
677
677
678
+ const dataSourceStructs = `
679
+ {{- range .Structs }}
680
+ type {{ .StructName }}{{ .ModelOrObject }} struct {
681
+ {{- range .Fields }}
682
+ {{ .Name }} {{ .Type }} {{ range .Tags }}{{ . }} {{ end }}
683
+ {{- end }}
684
+ }
685
+ {{- end }}
686
+ `
687
+
688
+ type datasourceStructFieldSpec struct {
689
+ Name string
690
+ Type string
691
+ Tags []string
692
+ }
693
+
694
+ type datasourceStructSpec struct {
695
+ StructName string
696
+ ModelOrObject string
697
+ Fields []datasourceStructFieldSpec
698
+ }
699
+
700
+ func terraformTypeForProperty (structPrefix string , prop * properties.SpecParam ) string {
701
+ if prop .Type == "" {
702
+ return fmt .Sprintf ("*%s%sObject" , structPrefix , prop .Name .CamelCase )
703
+ }
704
+
705
+ if prop .Type == "list" && prop .Items .Type == "entry" {
706
+ return fmt .Sprintf ("[]%s%sObject" , structPrefix , prop .Name .CamelCase )
707
+ }
708
+
709
+ if prop .Type == "list" {
710
+ return fmt .Sprintf ("[]types.%s" , pascalCase (prop .Items .Type ))
711
+ }
712
+
713
+ return fmt .Sprintf ("types.%s" , pascalCase (prop .Type ))
714
+ }
715
+
716
+ func structFieldSpec (param * properties.SpecParam , structPrefix string ) datasourceStructFieldSpec {
717
+ tfTag := fmt .Sprintf ("`tfsdk:\" %s\" `" , param .Name .Underscore )
718
+ return datasourceStructFieldSpec {
719
+ Name : param .Name .CamelCase ,
720
+ Type : terraformTypeForProperty (structPrefix , param ),
721
+ Tags : []string {tfTag },
722
+ }
723
+ }
724
+
725
+ func dataSourceStructContextForParam (structPrefix string , param * properties.SpecParam ) []datasourceStructSpec {
726
+ var structs []datasourceStructSpec
727
+
728
+ structName := fmt .Sprintf ("%s%s" , structPrefix , param .Name .CamelCase )
729
+
730
+ var params []datasourceStructFieldSpec
731
+ if param .Spec != nil {
732
+ for _ , elt := range param .Spec .Params {
733
+ params = append (params , structFieldSpec (elt , structName ))
734
+ }
735
+
736
+ for _ , elt := range param .Spec .OneOf {
737
+ params = append (params , structFieldSpec (elt , structName ))
738
+ }
739
+ }
740
+
741
+ structs = append (structs , datasourceStructSpec {
742
+ StructName : structName ,
743
+ ModelOrObject : "Object" ,
744
+ Fields : params ,
745
+ })
746
+
747
+ if param .Spec == nil {
748
+ return structs
749
+ }
750
+
751
+ for _ , elt := range param .Spec .Params {
752
+ if elt .Type == "" || (elt .Type == "list" && elt .Items .Type == "entry" ) {
753
+ structs = append (structs , dataSourceStructContextForParam (structName , elt )... )
754
+ }
755
+ }
756
+
757
+ for _ , elt := range param .Spec .OneOf {
758
+ if elt .Type == "" || (elt .Type == "list" && elt .Items .Type == "entry" ) {
759
+ structs = append (structs , dataSourceStructContextForParam (structName , elt )... )
760
+ }
761
+ }
762
+
763
+ return structs
764
+ }
765
+
766
+ func dataSourceStructContext (spec * properties.Normalization ) []datasourceStructSpec {
767
+ var structs []datasourceStructSpec
768
+
769
+ if spec .Spec == nil {
770
+ return nil
771
+ }
772
+
773
+ names := NewNameProvider (spec )
774
+
775
+ var fields []datasourceStructFieldSpec
776
+
777
+ for _ , elt := range spec .Spec .Params {
778
+ fields = append (fields , structFieldSpec (elt , names .DataSourceStructName ))
779
+ if elt .Type == "" || (elt .Type == "list" && elt .Items .Type == "entry" ) {
780
+ structs = append (structs , dataSourceStructContextForParam (names .DataSourceStructName , elt )... )
781
+ }
782
+ }
783
+
784
+ for _ , elt := range spec .Spec .OneOf {
785
+ fields = append (fields , structFieldSpec (elt , names .DataSourceStructName ))
786
+ if elt .Type == "" || (elt .Type == "list" && elt .Items .Type == "entry" ) {
787
+ structs = append (structs , dataSourceStructContextForParam (names .DataSourceStructName , elt )... )
788
+ }
789
+ }
790
+
791
+ structs = append (structs , datasourceStructSpec {
792
+ StructName : names .DataSourceStructName ,
793
+ ModelOrObject : "Model" ,
794
+ Fields : fields ,
795
+ })
796
+ return structs
797
+ }
798
+
799
+ func RenderDataSourceStructs (names * NameProvider , spec * properties.Normalization ) (string , error ) {
800
+ type context struct {
801
+ Structs []datasourceStructSpec
802
+ }
803
+
804
+ data := context {
805
+ Structs : dataSourceStructContext (spec ),
806
+ }
807
+
808
+ return processTemplate (dataSourceStructs , "render-locations-state-to-pango" , data , commonFuncMap )
809
+ }
810
+
678
811
func ResourceCreateFunction (names * NameProvider , serviceName string , paramSpec * properties.Normalization , terraformProvider * properties.TerraformProviderFile , resourceSDKName string ) (string , error ) {
679
812
funcMap := template.FuncMap {
680
813
"ConfigToEntry" : ConfigEntry ,
0 commit comments