diff --git a/pkg/sdk/poc/example/to_opts_optional_example_def.go b/pkg/sdk/poc/example/to_opts_optional_example_def.go new file mode 100644 index 0000000000..2278bf93ca --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_def.go @@ -0,0 +1,35 @@ +package example + +import ( + g "github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk/poc/generator" +) + +//go:generate go run ../main.go + +var ToOptsOptionalExample = g.NewInterface( + "ToOptsOptionalExamples", + "ToOptsOptionalExample", + g.KindOfT[DatabaseObjectIdentifier](), +).CreateOperation("https://example.com", + g.NewQueryStruct("Alter"). + Alter(). + IfExists(). + Name(), +).AlterOperation("https://example.com", + g.NewQueryStruct("Alter"). + Alter(). + IfExists(). + Name(). + OptionalQueryStructField( + "OptionalField", + g.NewQueryStruct("OptionalField"). + List("SomeList", "DatabaseObjectIdentifier", g.ListOptions()), + g.KeywordOptions(), + ). + QueryStructField( + "RequiredField", + g.NewQueryStruct("RequiredField"). + List("SomeRequiredList", "DatabaseObjectIdentifier", g.ListOptions().Required()), + g.KeywordOptions().Required(), + ), +) diff --git a/pkg/sdk/poc/example/to_opts_optional_example_dto_gen.go b/pkg/sdk/poc/example/to_opts_optional_example_dto_gen.go new file mode 100644 index 0000000000..840182049e --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_dto_gen.go @@ -0,0 +1,28 @@ +package example + +//go:generate go run ./dto-builder-generator/main.go + +var ( + _ optionsProvider[CreateToOptsOptionalExampleOptions] = new(CreateToOptsOptionalExampleRequest) + _ optionsProvider[AlterToOptsOptionalExampleOptions] = new(AlterToOptsOptionalExampleRequest) +) + +type CreateToOptsOptionalExampleRequest struct { + IfExists *bool + name DatabaseObjectIdentifier // required +} + +type AlterToOptsOptionalExampleRequest struct { + IfExists *bool + name DatabaseObjectIdentifier // required + OptionalField *OptionalFieldRequest + RequiredField RequiredFieldRequest // required +} + +type OptionalFieldRequest struct { + SomeList []DatabaseObjectIdentifier +} + +type RequiredFieldRequest struct { + SomeRequiredList []DatabaseObjectIdentifier // required +} diff --git a/pkg/sdk/poc/example/to_opts_optional_example_gen.go b/pkg/sdk/poc/example/to_opts_optional_example_gen.go new file mode 100644 index 0000000000..94fa3e262c --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_gen.go @@ -0,0 +1,32 @@ +package example + +import "context" + +type ToOptsOptionalExamples interface { + Create(ctx context.Context, request *CreateToOptsOptionalExampleRequest) error + Alter(ctx context.Context, request *AlterToOptsOptionalExampleRequest) error +} + +// CreateToOptsOptionalExampleOptions is based on https://example.com. +type CreateToOptsOptionalExampleOptions struct { + alter bool `ddl:"static" sql:"ALTER"` + IfExists *bool `ddl:"keyword" sql:"IF EXISTS"` + name DatabaseObjectIdentifier `ddl:"identifier"` +} + +// AlterToOptsOptionalExampleOptions is based on https://example.com. +type AlterToOptsOptionalExampleOptions struct { + alter bool `ddl:"static" sql:"ALTER"` + IfExists *bool `ddl:"keyword" sql:"IF EXISTS"` + name DatabaseObjectIdentifier `ddl:"identifier"` + OptionalField *OptionalField `ddl:"keyword"` + RequiredField RequiredField `ddl:"keyword"` +} + +type OptionalField struct { + SomeList []DatabaseObjectIdentifier `ddl:"list"` +} + +type RequiredField struct { + SomeRequiredList []DatabaseObjectIdentifier `ddl:"list"` +} diff --git a/pkg/sdk/poc/example/to_opts_optional_example_gen_integration_test.go b/pkg/sdk/poc/example/to_opts_optional_example_gen_integration_test.go new file mode 100644 index 0000000000..87aabad9f4 --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_gen_integration_test.go @@ -0,0 +1,15 @@ +package example + +import "testing" + +func TestInt_ToOptsOptionalExamples(t *testing.T) { + // TODO: prepare common resources + + t.Run("Create", func(t *testing.T) { + // TODO: fill me + }) + + t.Run("Alter", func(t *testing.T) { + // TODO: fill me + }) +} diff --git a/pkg/sdk/poc/example/to_opts_optional_example_gen_test.go b/pkg/sdk/poc/example/to_opts_optional_example_gen_test.go new file mode 100644 index 0000000000..758241a08c --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_gen_test.go @@ -0,0 +1,57 @@ +package example + +import "testing" + +func TestToOptsOptionalExamples_Create(t *testing.T) { + id := RandomDatabaseObjectIdentifier(t) + // Minimal valid CreateToOptsOptionalExampleOptions + defaultOpts := func() *CreateToOptsOptionalExampleOptions { + return &CreateToOptsOptionalExampleOptions{ + name: id, + } + } + + t.Run("validation: nil options", func(t *testing.T) { + var opts *CreateToOptsOptionalExampleOptions = nil + assertOptsInvalidJoinedErrors(t, opts, ErrNilOptions) + }) + + t.Run("basic", func(t *testing.T) { + opts := defaultOpts() + // TODO: fill me + assertOptsValidAndSQLEquals(t, opts, "TODO: fill me") + }) + + t.Run("all options", func(t *testing.T) { + opts := defaultOpts() + // TODO: fill me + assertOptsValidAndSQLEquals(t, opts, "TODO: fill me") + }) +} + +func TestToOptsOptionalExamples_Alter(t *testing.T) { + id := RandomDatabaseObjectIdentifier(t) + // Minimal valid AlterToOptsOptionalExampleOptions + defaultOpts := func() *AlterToOptsOptionalExampleOptions { + return &AlterToOptsOptionalExampleOptions{ + name: id, + } + } + + t.Run("validation: nil options", func(t *testing.T) { + var opts *AlterToOptsOptionalExampleOptions = nil + assertOptsInvalidJoinedErrors(t, opts, ErrNilOptions) + }) + + t.Run("basic", func(t *testing.T) { + opts := defaultOpts() + // TODO: fill me + assertOptsValidAndSQLEquals(t, opts, "TODO: fill me") + }) + + t.Run("all options", func(t *testing.T) { + opts := defaultOpts() + // TODO: fill me + assertOptsValidAndSQLEquals(t, opts, "TODO: fill me") + }) +} diff --git a/pkg/sdk/poc/example/to_opts_optional_example_impl_gen.go b/pkg/sdk/poc/example/to_opts_optional_example_impl_gen.go new file mode 100644 index 0000000000..f696c2dac9 --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_impl_gen.go @@ -0,0 +1,47 @@ +package example + +import ( + "context" +) + +var _ ToOptsOptionalExamples = (*toOptsOptionalExamples)(nil) + +type toOptsOptionalExamples struct { + client *Client +} + +func (v *toOptsOptionalExamples) Create(ctx context.Context, request *CreateToOptsOptionalExampleRequest) error { + opts := request.toOpts() + return validateAndExec(v.client, ctx, opts) +} + +func (v *toOptsOptionalExamples) Alter(ctx context.Context, request *AlterToOptsOptionalExampleRequest) error { + opts := request.toOpts() + return validateAndExec(v.client, ctx, opts) +} + +func (r *CreateToOptsOptionalExampleRequest) toOpts() *CreateToOptsOptionalExampleOptions { + opts := &CreateToOptsOptionalExampleOptions{ + IfExists: r.IfExists, + name: r.name, + } + return opts +} + +func (r *AlterToOptsOptionalExampleRequest) toOpts() *AlterToOptsOptionalExampleOptions { + opts := &AlterToOptsOptionalExampleOptions{ + IfExists: r.IfExists, + name: r.name, + } + + if r.OptionalField != nil { + opts.OptionalField = &OptionalField{ + SomeList: r.OptionalField.SomeList, + } + } + opts.RequiredField = RequiredField{ + SomeRequiredList: r.RequiredField.SomeRequiredList, + } + + return opts +} diff --git a/pkg/sdk/poc/example/to_opts_optional_example_validations_gen.go b/pkg/sdk/poc/example/to_opts_optional_example_validations_gen.go new file mode 100644 index 0000000000..a2b99f1ddd --- /dev/null +++ b/pkg/sdk/poc/example/to_opts_optional_example_validations_gen.go @@ -0,0 +1,24 @@ +package example + +import "errors" + +var ( + _ validatable = new(CreateToOptsOptionalExampleOptions) + _ validatable = new(AlterToOptsOptionalExampleOptions) +) + +func (opts *CreateToOptsOptionalExampleOptions) validate() error { + if opts == nil { + return ErrNilOptions + } + var errs []error + return errors.Join(errs...) +} + +func (opts *AlterToOptsOptionalExampleOptions) validate() error { + if opts == nil { + return ErrNilOptions + } + var errs []error + return errors.Join(errs...) +} diff --git a/pkg/sdk/poc/generator/templates/operation_struct.tmpl b/pkg/sdk/poc/generator/templates/operation_struct.tmpl index 4bb00b891a..2d80492437 100644 --- a/pkg/sdk/poc/generator/templates/operation_struct.tmpl +++ b/pkg/sdk/poc/generator/templates/operation_struct.tmpl @@ -6,3 +6,4 @@ type {{ .OptsField.KindNoPtr }} struct { {{ .Name }} {{ .Kind }} {{ .TagsPrintable }} {{- end }} } + diff --git a/pkg/sdk/poc/generator/templates/struct.tmpl b/pkg/sdk/poc/generator/templates/struct.tmpl index b4ebac53c0..5c485c361b 100644 --- a/pkg/sdk/poc/generator/templates/struct.tmpl +++ b/pkg/sdk/poc/generator/templates/struct.tmpl @@ -5,3 +5,4 @@ type {{ .KindNoPtr }} struct { {{ .Name }} {{ .Kind }} {{ .TagsPrintable }} {{- end }} } + diff --git a/pkg/sdk/poc/generator/templates/sub_templates/to_opts_mapping.tmpl b/pkg/sdk/poc/generator/templates/sub_templates/to_opts_mapping.tmpl index d304292cc5..57bf0ec3bb 100644 --- a/pkg/sdk/poc/generator/templates/sub_templates/to_opts_mapping.tmpl +++ b/pkg/sdk/poc/generator/templates/sub_templates/to_opts_mapping.tmpl @@ -14,8 +14,8 @@ if r{{ .Path }} != nil { {{ end }} - {{- if not .IsSlice }} - opts{{ .Path }} = {{ template "toOptsMapping" . -}}{{/* Recursive call */}} + {{- if not .IsSlice -}} + opts{{ .Path }} = {{ if .IsPointer }}&{{end}}{{ template "toOptsMapping" . -}}{{/* Recursive call */}} {{- else }} s := make({{ .Kind }}, len(r{{ .Path }})) for i, v := range r{{ .Path }} { @@ -28,9 +28,9 @@ opts{{ .Path }} = s {{ end -}} - {{ if or .IsPointer .IsSlice }} + {{ if or .IsPointer .IsSlice -}} } - {{ end }} + {{- end -}} {{- end -}} {{ end -}} {{ end }} diff --git a/pkg/sdk/poc/main.go b/pkg/sdk/poc/main.go index 6787167c25..d7fd8c094a 100644 --- a/pkg/sdk/poc/main.go +++ b/pkg/sdk/poc/main.go @@ -18,6 +18,7 @@ import ( var definitionMapping = map[string]*generator.Interface{ "database_role_def.go": example.DatabaseRole, + "to_opts_optional_example_def.go": example.ToOptsOptionalExample, "network_policies_def.go": sdk.NetworkPoliciesDef, "session_policies_def.go": sdk.SessionPoliciesDef, "tasks_def.go": sdk.TasksDef,