Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 108 additions & 69 deletions internal/resources/contenttype/model.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package contenttype

Check failure on line 1 in internal/resources/contenttype/model.go

View workflow job for this annotation

GitHub Actions / test

: # github.com/labd/terraform-provider-contentful/internal/resources/contenttype [github.com/labd/terraform-provider-contentful/internal/resources/contenttype.test]

import (
"fmt"
Expand All @@ -21,7 +21,7 @@
DisplayField types.String `tfsdk:"display_field"`
Description types.String `tfsdk:"description"`
Version types.Int64 `tfsdk:"version"`
Fields []Field `tfsdk:"fields"`
Fields Fields `tfsdk:"fields"`
}

type Field struct {
Expand All @@ -33,11 +33,22 @@
Localized types.Bool `tfsdk:"localized"`
Disabled types.Bool `tfsdk:"disabled"`
Omitted types.Bool `tfsdk:"omitted"`
Validations []Validation `tfsdk:"validations"`
Validations *[]Validation `tfsdk:"validations"`
Items *Items `tfsdk:"items"`
DefaultValue *DefaultValue `tfsdk:"default_value"`
}

type Fields []Field

func (f *Fields) FindByName(name string) *Field {
for _, field := range *f {
if field.Name.ValueString() == name {
return &field
}
}
return nil
}

type DefaultValue struct {
Bool types.Map `tfsdk:"bool"`
String types.Map `tfsdk:"string"`
Expand Down Expand Up @@ -511,73 +522,85 @@
}
}

func (f *Field) Equal(n sdk.Field) bool {
func (f *Field) Equal(n sdk.Field) (bool, error) {

if string(n.Type) != f.Type.ValueString() {
return false
return false, nil
}

if n.Id != f.Id.ValueString() {
return false
return false, nil
}

if n.Name != f.Name.ValueString() {
return false
return false, nil
}

if n.LinkType != nil && string(*n.LinkType) != f.LinkType.ValueString() {
return false
return false, nil
}

if n.LinkType == nil && !f.LinkType.IsNull() {
return false
return false, nil
}

if n.Required != f.Required.ValueBool() {
return false
return false, nil
}

if n.Omitted != f.Omitted.ValueBoolPointer() {
return false
return false, nil
}

if n.Disabled != f.Disabled.ValueBoolPointer() {
return false
return false, nil
}

if n.Localized != f.Localized.ValueBool() {
return false
return false, nil
}

if f.Items == nil && n.Items != nil {
return false
return false, nil
}

if f.Items != nil && !f.Items.Equal(n.Items) {
return false
iEq, err := f.Items.Equal(n.Items)
if err != nil {
return false, err
}
if !iEq {
return false, nil
}

if !compareValidations(f.Validations, n.Validations) {
return false
vEq, err := compareValidations(f.Validations, n.Validations)
if err != nil {
return false, err
}
if !vEq {
return false, nil
}

if f.DefaultValue != nil && !reflect.DeepEqual(f.DefaultValue.Draft(), n.DefaultValue) {
return false
return false, nil
}

return true
return true, nil
}

func createValidations(validations []Validation) ([]sdk.FieldValidation, error) {
var contentfulValidations []sdk.FieldValidation
for i, validation := range validations {
func createValidations(validations *[]Validation) (*[]sdk.FieldValidation, error) {
if validations == nil {
return nil, nil
}

var contentfulValidations = make([]sdk.FieldValidation, 0, len(*validations))
for i, validation := range *validations {
value, err := validation.Draft()
if err != nil {
return nil, fmt.Errorf("failed to create validation at index %d: %w", i, err)
}
contentfulValidations = append(contentfulValidations, *value)
}
return contentfulValidations, nil
return &contentfulValidations, nil
}

func (f *Field) ToNative() (*sdk.Field, error) {
Expand All @@ -595,7 +618,7 @@
Required: f.Required.ValueBool(),
Disabled: f.Disabled.ValueBoolPointer(),
Omitted: f.Omitted.ValueBoolPointer(),
Validations: &validations,
Validations: validations,
}

if !f.LinkType.IsNull() && !f.LinkType.IsUnknown() {
Expand Down Expand Up @@ -664,7 +687,6 @@
}

if defaultValueType != nil {

f.DefaultValue = &DefaultValue{
Bool: types.MapNull(types.BoolType),
String: types.MapNull(types.StringType),
Expand Down Expand Up @@ -753,9 +775,9 @@
}

type Items struct {
Type types.String `tfsdk:"type"`
LinkType types.String `tfsdk:"link_type"`
Validations []Validation `tfsdk:"validations"`
Type types.String `tfsdk:"type"`
LinkType types.String `tfsdk:"link_type"`
Validations *[]Validation `tfsdk:"validations"`
}

func (i *Items) ToNative() (*sdk.FieldItem, error) {
Expand All @@ -771,7 +793,7 @@

if fieldType == "Symbol" {
err := item.FromFieldItemSymbol(sdk.FieldItemSymbol{
Validations: &validations,
Validations: validations,
})
if err != nil {
return nil, err
Expand All @@ -781,7 +803,7 @@

if fieldType == "Link" || fieldType == "ResourceLink" {
err := item.FromFieldItemLink(sdk.FieldItemLink{
Validations: &validations,
Validations: validations,
LinkType: sdk.FieldItemLinkLinkType(i.LinkType.ValueString()),
})

Expand All @@ -795,33 +817,37 @@
return nil, fmt.Errorf("unsupported item type used, %s. Please implement", fieldType)
}

func (i *Items) Equal(n *sdk.FieldItem) bool {
func (i *Items) Equal(n *sdk.FieldItem) (bool, error) {

if n == nil {
return false
return false, nil
}

itemType, err := n.Discriminator()
if err != nil {
panic(err)
return false, err
}

if i.Type.ValueString() != itemType {
return false
return false, nil
}

if itemType != "Symbol" {
linkItem, err := n.AsFieldItemLink()
if err != nil {
panic(err)
return false, err
}

if !utils.CompareStringPointer(i.LinkType, utils.Pointer(string(linkItem.LinkType))) {
return false
return false, nil
}

if !compareValidations(i.Validations, linkItem.Validations) {
return false
vEq, err := compareValidations(i.Validations, linkItem.Validations)
if err != nil {
return false, err
}
if !vEq {
return false, nil
}

} else {
Expand All @@ -830,12 +856,16 @@
panic(err)
}

if !compareValidations(i.Validations, symbolItem.Validations) {
return false
vEq, err := compareValidations(i.Validations, symbolItem.Validations)
if err != nil {
return false, err
}
if !vEq {
return false, nil
}
}

return true
return true, nil
}

func (c *ContentType) Create() (*sdk.ContentTypeCreate, error) {
Expand Down Expand Up @@ -899,8 +929,7 @@
c.Name = types.StringValue(n.Name)
c.DisplayField = types.StringPointerValue(n.DisplayField)

var fields []Field

var fields = make([]Field, 0, len(n.Fields))
for _, nf := range n.Fields {
field := &Field{}
err := field.Import(nf)
Expand All @@ -916,22 +945,21 @@

}

func (c *ContentType) Equal(n *sdk.ContentType) bool {

func (c *ContentType) Equal(n *sdk.ContentType) (bool, error) {
if !utils.CompareStringPointer(c.Description, n.Description) {
return false
return false, nil
}

if c.Name.ValueString() != n.Name {
return false
return false, nil
}

if c.DisplayField.ValueStringPointer() != n.DisplayField {
return false
return false, nil
}

if len(c.Fields) != len(n.Fields) {
return false
return false, nil
}

for idxOrg, field := range c.Fields {
Expand All @@ -940,29 +968,34 @@
})

if idx == -1 {
return false
return false, nil
}

if !field.Equal(n.Fields[idx]) {
return false
fEq, err := field.Equal(n.Fields[idx])
if err != nil {
return false, nil
}
if !fEq {
return false, nil
}

// field was moved, it is the same as before but different position
if idxOrg != idx {
return false
return false, nil
}
}

return true
return true, nil
}

func getValidations(contentfulValidations *[]sdk.FieldValidation) ([]Validation, error) {
var validations []Validation
func getValidations(contentfulValidations *[]sdk.FieldValidation) (*[]Validation, error) {

if contentfulValidations == nil {
return validations, nil
return nil, nil
}

var validations = make([]Validation, 0, len(*contentfulValidations))

for _, validation := range *contentfulValidations {

val, err := getValidation(validation)
Expand All @@ -974,7 +1007,7 @@
validations = append(validations, *val)
}

return validations, nil
return &validations, nil
}

func getValidation(cfVal sdk.FieldValidation) (*Validation, error) {
Expand Down Expand Up @@ -1277,29 +1310,35 @@
return nodes
}

func compareValidations(a []Validation, b *[]sdk.FieldValidation) bool {
if b == nil {
return len(a) == 0
func compareValidations(a *[]Validation, b *[]sdk.FieldValidation) (bool, error) {
if a == nil && b == nil {
return true, nil
}

if b != nil && a == nil {
return false, nil
}

other := *b
if a != nil && b == nil {
return false, nil
}

if len(a) != len(other) {
return false
if len(*a) != len(*b) {
return false, nil
}

validations, err := createValidations(a)
if err != nil {
panic(err)
return false, err
}

for idx, validation := range validations {
cfVal := other[idx]
for idx, validation := range *validations {
cfVal := (*b)[idx]

if !reflect.DeepEqual(validation, cfVal) {
return false
return false, nil
}
}

return true
return true, nil
}
Loading
Loading