diff --git a/internal/helper/validation/valid_notification_variables.go b/internal/helper/validation/valid_notification_variables.go new file mode 100644 index 00000000..261406f6 --- /dev/null +++ b/internal/helper/validation/valid_notification_variables.go @@ -0,0 +1,52 @@ +package validation + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + + "github.com/honeycombio/terraform-provider-honeycombio/internal/models" +) + +var _ validator.Set = notificationVariablesValidator{} + +type notificationVariablesValidator struct { + schemes []string +} + +func (v notificationVariablesValidator) Description(_ context.Context) string { + return "value must be a valid set of webhook variables" +} + +func (v notificationVariablesValidator) MarkdownDescription(ctx context.Context) string { + return v.Description(ctx) +} + +func (v notificationVariablesValidator) ValidateSet(ctx context.Context, request validator.SetRequest, response *validator.SetResponse) { + if request.ConfigValue.IsNull() || request.ConfigValue.IsUnknown() { + return + } + + // variable names cannot be duplicated + var variables []models.NotificationVariableModel + response.Diagnostics.Append(request.ConfigValue.ElementsAs(ctx, &variables, false)...) + + duplicateMap := make(map[string]bool) + for i, v := range variables { + name := v.Name.ValueString() + if duplicateMap[name] { + response.Diagnostics.AddAttributeError( + path.Root("variable").AtListIndex(i).AtName("name"), + "Conflicting configuration arguments", + "cannot have more than one \"variable\" with the same \"name\"", + ) + } + duplicateMap[name] = true + } +} + +// ValidQuerySpec determines if the provided JSON is a valid Honeycomb Query Specification +func ValidNotificationVariables() validator.Set { + return notificationVariablesValidator{} +} diff --git a/internal/provider/notification_recipients.go b/internal/provider/notification_recipients.go index a74775f0..ae57b3fd 100644 --- a/internal/provider/notification_recipients.go +++ b/internal/provider/notification_recipients.go @@ -20,6 +20,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-framework/types/basetypes" + "github.com/honeycombio/terraform-provider-honeycombio/internal/helper/validation" + "github.com/honeycombio/terraform-provider-honeycombio/client" "github.com/honeycombio/terraform-provider-honeycombio/internal/helper" "github.com/honeycombio/terraform-provider-honeycombio/internal/helper/modifiers" @@ -90,6 +92,7 @@ func notificationRecipientSchema(allowedTypes []client.RecipientType) schema.Set Description: "The variables to set with the webhook notification.", Validators: []validator.Set{ setvalidator.SizeAtMost(10), + validation.ValidNotificationVariables(), }, NestedObject: schema.NestedBlockObject{ Attributes: map[string]schema.Attribute{