From 797d5c96ad403180459f798031774b0ffcc69ef0 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Sun, 2 Jun 2024 14:19:58 -0400 Subject: [PATCH] feat: add AddReference method to References Signed-off-by: Yordis Prieto --- pkg/config/resource.go | 16 ++++++++++++++++ pkg/config/resource_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/pkg/config/resource.go b/pkg/config/resource.go index e7002629..5ca4d53d 100644 --- a/pkg/config/resource.go +++ b/pkg/config/resource.go @@ -165,10 +165,26 @@ type ExternalName struct { IdentifierFields []string } +var ErrReferenceAlreadyExists = errors.New("reference for field already exists") + // References represents reference resolver configurations for the fields of a // given resource. Key should be the field path of the field to be referenced. type References map[string]Reference +// AddReference adds a reference configuration for the given field path. +// The fieldPath is the Terraform field path of the field to be referenced. +// +// Example: "vpc_id" or "forwarding_rule.certificate_name" in case of nested +// in another object. +func (r References) AddReference(fieldPath string, ref Reference) error { + if _, ok := r[fieldPath]; ok { + return ErrReferenceAlreadyExists + } + + r[fieldPath] = ref + return nil +} + // Reference represents the Crossplane options used to generate // reference resolvers for fields type Reference struct { diff --git a/pkg/config/resource_test.go b/pkg/config/resource_test.go index a94366c7..f2ac76df 100644 --- a/pkg/config/resource_test.go +++ b/pkg/config/resource_test.go @@ -112,3 +112,34 @@ func TestSetExternalTagsWithPaved(t *testing.T) { }) } } + +func TestReferences_AddReference(t *testing.T) { + t.Run("Adding a reference", func(t *testing.T) { + r := &Resource{References: References{}} + err := r.References.AddReference("forwarding_rule.certificate_name", Reference{ + TerraformName: "digitalocean_certificate", + }) + if err != nil { + t.Fatalf("AddReference() got error: %v", err) + } + if len(r.References) != 1 { + t.Fatalf("AddReference() got error: %v", err) + } + }) + t.Run("Adding twice a reference for a given field", func(t *testing.T) { + r := &Resource{References: References{}} + err := r.References.AddReference("forwarding_rule.certificate_name", Reference{ + TerraformName: "digitalocean_certificate", + }) + if err != nil { + t.Fatalf("AddReference() got error: %v", err) + } + + err = r.References.AddReference("forwarding_rule.certificate_name", Reference{ + TerraformName: "digitalocean_certificate", + }) + if !errors.Is(err, ErrReferenceAlreadyExists) { + t.Fatalf("AddReference() should have returned an error") + } + }) +}