Skip to content

Commit

Permalink
Adding types for use with attribute fields and making the template fo…
Browse files Browse the repository at this point in the history
…r use with primitive attributes generic (#31)
  • Loading branch information
bendbennett committed Aug 8, 2023
1 parent 35002a5 commit 752d3ce
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 58 deletions.
85 changes: 53 additions & 32 deletions internal/schema/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -552,33 +552,20 @@ func (g GeneratorSchema) ModelsToFromBytes() ([]byte, error) {
if _, ok := attributeAssocExtType.(Attributes); ok {
// TODO: Handle objects - list, map, set, single nested object
} else {
var t *template.Template
var err error
var templateData attributeField

switch attributeAssocExtType.AttrType() {
case types.BoolType:
t, err = template.New("model_bool_to_from").Parse(templates.ModelBoolToFromTemplate)
if err != nil {
return nil, err
}
templateData = boolAttributeField(model.SnakeCaseToCamelCase(k), assocExtType.Type(), assocExtType.TypeReference())
}

if t == nil {
return nil, fmt.Errorf("no template defined for %s, type %T", k, g.Attributes[k])
t, err := template.New("primitive_to_from").Parse(templates.PrimitiveToFromTemplate)
if err != nil {
return nil, err
}

var tBuf bytes.Buffer

templateData := struct {
Name string
Type string
TypeReference string
}{
Name: model.SnakeCaseToCamelCase(k),
Type: assocExtType.Type(),
TypeReference: assocExtType.TypeReference(),
}

err = t.Execute(&tBuf, templateData)
if err != nil {
return nil, err
Expand Down Expand Up @@ -633,7 +620,7 @@ func (g GeneratorSchema) ModelsToFromBytes() ([]byte, error) {
return nil, fmt.Errorf("all block types must implement Blocks, %s does not", k)
}

var fields []field
var fields []objectField

blockAttributes := a.GetAttributes()

Expand All @@ -652,14 +639,14 @@ func (g GeneratorSchema) ModelsToFromBytes() ([]byte, error) {
// TODO: Remove type assertion once all attributes and blocks implement AssocExtType()
if y, ok := blockAttributes[x].(GeneratorAttributeAssocExtType); ok {
if y.AssocExtType() != nil {
fields = append(fields, boolField(model.SnakeCaseToCamelCase(x), true))
fields = append(fields, boolObjectField(model.SnakeCaseToCamelCase(x), true))
continue
}

fields = append(fields, boolField(model.SnakeCaseToCamelCase(x), false))
fields = append(fields, boolObjectField(model.SnakeCaseToCamelCase(x), false))
}
case types.Int64Type:
fields = append(fields, int64Field(model.SnakeCaseToCamelCase(x), false))
fields = append(fields, int64ObjectField(model.SnakeCaseToCamelCase(x), false))
}
}

Expand All @@ -681,7 +668,7 @@ func (g GeneratorSchema) ModelsToFromBytes() ([]byte, error) {
Name string
Type string
TypeReference string
Fields []field
Fields []objectField
}{
Name: model.SnakeCaseToCamelCase(k),
Type: assocExtType.Type(),
Expand Down Expand Up @@ -722,27 +709,61 @@ func (g GeneratorSchema) ModelsToFromBytes() ([]byte, error) {
}

type field struct {
DefaultTo string
DefaultFrom string
}

type attributeField struct {
Name string
Type string
TypeReference string
TfType string
field
}

type objectField struct {
Name string
HasAssocExtType bool
DefaultTo string
DefaultFrom string
field
}

func boolField() field {
return field{
DefaultTo: "ValueBoolPointer",
DefaultFrom: "BoolPointerValue",
}
}

func boolField(name string, hasAssocType bool) field {
func int64Field() field {
return field{
DefaultTo: "ValueInt64Pointer",
DefaultFrom: "Int64PointerValue",
}
}

func boolAttributeField(name, assocType, typeReference string) attributeField {
return attributeField{
Name: name,
Type: assocType,
TypeReference: typeReference,
TfType: "types.Bool",
field: boolField(),
}
}

func boolObjectField(name string, hasAssocType bool) objectField {
return objectField{
Name: name,
HasAssocExtType: hasAssocType,
DefaultTo: "ValueBoolPointer",
DefaultFrom: "BoolPointerValue",
field: boolField(),
}
}

func int64Field(name string, hasAssocType bool) field {
return field{
func int64ObjectField(name string, hasAssocType bool) objectField {
return objectField{
Name: name,
HasAssocExtType: hasAssocType,
DefaultTo: "ValueInt64Pointer",
DefaultFrom: "Int64PointerValue",
field: int64Field(),
}
}

Expand Down
6 changes: 3 additions & 3 deletions internal/templates/embed.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import (
//go:embed model_object_helpers.gotmpl
var ModelObjectHelpersTemplate string

//go:embed model_bool_to_from.gotmpl
var ModelBoolToFromTemplate string

//go:embed model_object_to_from.gotmpl
var ModelObjectToFromTemplate string

//go:embed primitive_to_from.gotmpl
var PrimitiveToFromTemplate string

//go:embed schema.gotmpl
var SchemaGoTemplate string
23 changes: 0 additions & 23 deletions internal/templates/model_bool_to_from.gotmpl

This file was deleted.

23 changes: 23 additions & 0 deletions internal/templates/primitive_to_from.gotmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
func To{{.Name}}(ctx context.Context, tfType {{.TfType}}) ({{.Type}}, diag.Diagnostics) {
var diags diag.Diagnostics

if tfType.IsNull() || tfType.IsUnknown() {
return nil, diags
}

apiObject := &{{.TypeReference}}{
{{.Name}}: tfType.{{.DefaultTo}}(),
}

return apiObject, diags
}

func From{{.Name}}(ctx context.Context, apiObject {{.Type}}) ({{.TfType}}, diag.Diagnostics) {
var diags diag.Diagnostics

if apiObject == nil {
return {{.TfType}}Null(), diags
}

return types.{{.DefaultFrom}}(apiObject.{{.Name}}), diags
}

0 comments on commit 752d3ce

Please sign in to comment.