From b8296e8580f65b4e0631db383a7d211c6565c250 Mon Sep 17 00:00:00 2001 From: Masayuki Morita Date: Tue, 22 Nov 2022 15:35:06 +0900 Subject: [PATCH] Use BlockFilter instead of ResourceFilter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As the number of similar functions increases for each type of block, it’s time to generalize them. Before moving to the Generics, we first commonize the logic and cast it with a type assertion. --- filter/awsv4upgrade/aws_s3_bucket.go | 43 +++++----- .../aws_s3_bucket_acceleration_status.go | 17 +--- .../aws_s3_bucket_acceleration_status_test.go | 6 +- filter/awsv4upgrade/aws_s3_bucket_acl.go | 17 +--- filter/awsv4upgrade/aws_s3_bucket_acl_test.go | 6 +- .../awsv4upgrade/aws_s3_bucket_cors_rule.go | 17 +--- .../aws_s3_bucket_cors_rule_test.go | 6 +- filter/awsv4upgrade/aws_s3_bucket_grant.go | 17 +--- .../awsv4upgrade/aws_s3_bucket_grant_test.go | 6 +- .../aws_s3_bucket_lifecycle_rule.go | 17 +--- .../aws_s3_bucket_lifecycle_rule_test.go | 6 +- filter/awsv4upgrade/aws_s3_bucket_logging.go | 17 +--- .../aws_s3_bucket_logging_test.go | 6 +- ...aws_s3_bucket_object_lock_configuration.go | 19 +---- ...3_bucket_object_lock_configuration_test.go | 6 +- filter/awsv4upgrade/aws_s3_bucket_policy.go | 17 +--- .../awsv4upgrade/aws_s3_bucket_policy_test.go | 6 +- ...aws_s3_bucket_replication_configuration.go | 19 +---- ...3_bucket_replication_configuration_test.go | 6 +- .../aws_s3_bucket_request_payer.go | 17 +--- .../aws_s3_bucket_request_payer_test.go | 6 +- ...et_server_side_encryption_configuration.go | 17 +--- ...rver_side_encryption_configuration_test.go | 6 +- .../awsv4upgrade/aws_s3_bucket_versioning.go | 17 +--- .../aws_s3_bucket_versioning_test.go | 6 +- filter/awsv4upgrade/aws_s3_bucket_website.go | 17 +--- .../aws_s3_bucket_website_test.go | 6 +- tfeditor/filter_block.go | 82 +++++++++++++++++++ tfeditor/filter_resource.go | 12 +++ tfeditor/filter_vertical_formatter.go | 14 +--- tfwrite/file.go | 10 +-- 31 files changed, 226 insertions(+), 238 deletions(-) create mode 100644 tfeditor/filter_block.go diff --git a/filter/awsv4upgrade/aws_s3_bucket.go b/filter/awsv4upgrade/aws_s3_bucket.go index f52d240..0fe7f39 100644 --- a/filter/awsv4upgrade/aws_s3_bucket.go +++ b/filter/awsv4upgrade/aws_s3_bucket.go @@ -11,47 +11,48 @@ import ( // aws_s3_bucket to AWS provider v4. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#s3-bucket-refactor type AWSS3BucketFilter struct { - filters []tfeditor.ResourceFilter + filters []tfeditor.BlockFilter } var _ editor.Filter = (*AWSS3BucketFilter)(nil) // NewAWSS3BucketFilter creates a new instance of AWSS3BucketFilter. func NewAWSS3BucketFilter() editor.Filter { - filters := []tfeditor.ResourceFilter{ - &AWSS3BucketAccelerationStatusFilter{}, - &AWSS3BucketACLFilter{}, - &AWSS3BucketCorsRuleFilter{}, - &AWSS3BucketGrantFilter{}, - &AWSS3BucketLifecycleRuleFilter{}, - &AWSS3BucketLoggingFilter{}, - &AWSS3BucketObjectLockConfigurationFilter{}, - &AWSS3BucketPolicyFilter{}, - &AWSS3BucketReplicationConfigurationFilter{}, - &AWSS3BucketRequestPayerFilter{}, - &AWSS3BucketServerSideEncryptionConfigurationFilter{}, - &AWSS3BucketVersioningFilter{}, - &AWSS3BucketWebsiteFilter{}, + filters := []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketAccelerationStatusResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketACLResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketCorsRuleResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketGrantResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketLifecycleRuleResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketLoggingResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketObjectLockConfigurationResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketPolicyResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketReplicationConfigurationResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketRequestPayerResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketServerSideEncryptionConfigurationResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketVersioningResourceFilter), + tfeditor.ResourceFilterFunc(AWSS3BucketWebsiteResourceFilter), // Remove redundant TokenNewLine tokens in the resource block after removing nested blocks. // Since VerticalFormat clears tokens internally, we should call it at the end. - tfeditor.NewVerticalFormatterResourceFilter(), + tfeditor.BlockFilterFunc(tfeditor.VerticalFormatterFilter), } + return &AWSS3BucketFilter{filters: filters} } // Filter upgrades arguments of aws_s3_bucket to AWS provider v4. // Some rules have not been implemented yet. func (f *AWSS3BucketFilter) Filter(inFile *hclwrite.File) (*hclwrite.File, error) { - m := tfeditor.NewResourcesByTypeFilter("aws_s3_bucket", f) + m := tfeditor.NewBlocksByTypeFilter("resource", "aws_s3_bucket", f) return m.Filter(inFile) } -// ResourceFilter upgrades arguments of aws_s3_bucket to AWS provider v4. +// BlockFilter upgrades arguments of aws_s3_bucket to AWS provider v4. // Some rules have not been implemented yet. -func (f *AWSS3BucketFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { - m := tfeditor.NewMultiResourceFilter(f.filters) - return m.ResourceFilter(inFile, resource) +func (f *AWSS3BucketFilter) BlockFilter(inFile *tfwrite.File, block tfwrite.Block) (*tfwrite.File, error) { + m := tfeditor.NewMultiBlockFilter(f.filters) + return m.BlockFilter(inFile, block) } // setParentBucket is a helper method for setting the followings: diff --git a/filter/awsv4upgrade/aws_s3_bucket_acceleration_status.go b/filter/awsv4upgrade/aws_s3_bucket_acceleration_status.go index b663944..3347942 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_acceleration_status.go +++ b/filter/awsv4upgrade/aws_s3_bucket_acceleration_status.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketAccelerationStatusFilter is a filter implementation for upgrading -// the acceleration_status argument of aws_s3_bucket. +// AWSS3BucketAccelerationStatusResourceFilter is a filter +// implementation for upgrading the acceleration_status argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#acceleration_status-argument -type AWSS3BucketAccelerationStatusFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketAccelerationStatusFilter)(nil) - -// NewAWSS3BucketAccelerationStatusFilter creates a new instance of AWSS3BucketAccelerationStatusFilter. -func NewAWSS3BucketAccelerationStatusFilter() tfeditor.ResourceFilter { - return &AWSS3BucketAccelerationStatusFilter{} -} - -// ResourceFilter upgrades the acceleration_status argument of aws_s3_bucket. -func (f *AWSS3BucketAccelerationStatusFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketAccelerationStatusResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldAttribute := "acceleration_status" newResourceType := "aws_s3_bucket_accelerate_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_acceleration_status_test.go b/filter/awsv4upgrade/aws_s3_bucket_acceleration_status_test.go index 363de39..f7c790b 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_acceleration_status_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_acceleration_status_test.go @@ -55,7 +55,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketAccelerationStatusFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketAccelerationStatusResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_acl.go b/filter/awsv4upgrade/aws_s3_bucket_acl.go index 23e505c..f027a7e 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_acl.go +++ b/filter/awsv4upgrade/aws_s3_bucket_acl.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketACLFilter is a filter implementation for upgrading the acl -// argument of aws_s3_bucket. +// AWSS3BucketACLResourceFilter is a filter implementation for upgrading the +// acl argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#acl-argument -type AWSS3BucketACLFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketACLFilter)(nil) - -// NewAWSS3BucketACLFilter creates a new instance of AWSS3BucketACLFilter. -func NewAWSS3BucketACLFilter() tfeditor.ResourceFilter { - return &AWSS3BucketACLFilter{} -} - -// ResourceFilter upgrades the acl argument of aws_s3_bucket. -func (f *AWSS3BucketACLFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketACLResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldAttribute := "acl" newResourceType := "aws_s3_bucket_acl" diff --git a/filter/awsv4upgrade/aws_s3_bucket_acl_test.go b/filter/awsv4upgrade/aws_s3_bucket_acl_test.go index 9dc622e..4bc8647 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_acl_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_acl_test.go @@ -55,7 +55,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketACLFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketACLResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_cors_rule.go b/filter/awsv4upgrade/aws_s3_bucket_cors_rule.go index b078057..c5bfb28 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_cors_rule.go +++ b/filter/awsv4upgrade/aws_s3_bucket_cors_rule.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketCorsRuleFilter is a filter implementation for upgrading the -// cors_rule argument of aws_s3_bucket. +// AWSS3BucketCorsRuleResourceFilter is a filter implementation for upgrading +// the cors_rule argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#cors_rule-argument -type AWSS3BucketCorsRuleFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketCorsRuleFilter)(nil) - -// NewAWSS3BucketCorsRuleFilter creates a new instance of AWSS3BucketCorsRuleFilter. -func NewAWSS3BucketCorsRuleFilter() tfeditor.ResourceFilter { - return &AWSS3BucketCorsRuleFilter{} -} - -// ResourceFilter upgrades the cors_rule argument of aws_s3_bucket. -func (f *AWSS3BucketCorsRuleFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketCorsRuleResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "cors_rule" newResourceType := "aws_s3_bucket_cors_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_cors_rule_test.go b/filter/awsv4upgrade/aws_s3_bucket_cors_rule_test.go index 1ab76f2..ab54ae2 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_cors_rule_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_cors_rule_test.go @@ -116,7 +116,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketCorsRuleFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketCorsRuleResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_grant.go b/filter/awsv4upgrade/aws_s3_bucket_grant.go index 560ed92..8924aca 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_grant.go +++ b/filter/awsv4upgrade/aws_s3_bucket_grant.go @@ -1,25 +1,14 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" "github.com/zclconf/go-cty/cty" ) -// AWSS3BucketGrantFilter is a filter implementation for upgrading the -// grant argument of aws_s3_bucket. +// AWSS3BucketGrantResourceFilter is a filter implementation for +// upgrading the grant argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#grant-argument -type AWSS3BucketGrantFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketGrantFilter)(nil) - -// NewAWSS3BucketGrantFilter creates a new instance of AWSS3BucketGrantFilter. -func NewAWSS3BucketGrantFilter() tfeditor.ResourceFilter { - return &AWSS3BucketGrantFilter{} -} - -// ResourceFilter upgrades the grant argument of aws_s3_bucket. -func (f *AWSS3BucketGrantFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketGrantResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "grant" newResourceType := "aws_s3_bucket_acl" diff --git a/filter/awsv4upgrade/aws_s3_bucket_grant_test.go b/filter/awsv4upgrade/aws_s3_bucket_grant_test.go index 1710be9..840885e 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_grant_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_grant_test.go @@ -108,7 +108,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketGrantFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketGrantResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule.go b/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule.go index cdac190..07bb213 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule.go +++ b/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule.go @@ -5,25 +5,14 @@ import ( "strings" "time" - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" "github.com/zclconf/go-cty/cty" ) -// AWSS3BucketLifecycleRuleFilter is a filter implementation for upgrading the -// lifecycle_rule argument of aws_s3_bucket. +// AWSS3BucketLifecycleRuleResourceFilter is a filter implementation for +// upgrading the lifecycle_rule argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#lifecycle_rule-argument -type AWSS3BucketLifecycleRuleFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketLifecycleRuleFilter)(nil) - -// NewAWSS3BucketLifecycleRuleFilter creates a new instance of AWSS3Bucketlifecycle_ruleFilter. -func NewAWSS3BucketLifecycleRuleFilter() tfeditor.ResourceFilter { - return &AWSS3BucketLifecycleRuleFilter{} -} - -// ResourceFilter upgrades the lifecycle_rule argument of aws_s3_bucket. -func (f *AWSS3BucketLifecycleRuleFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketLifecycleRuleResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "lifecycle_rule" newResourceType := "aws_s3_bucket_lifecycle_configuration" newNestedBlock := "rule" diff --git a/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule_test.go b/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule_test.go index 9ab92a8..3ef1263 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule_test.go @@ -549,7 +549,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketLifecycleRuleFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketLifecycleRuleResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_logging.go b/filter/awsv4upgrade/aws_s3_bucket_logging.go index c5d9d46..bf5af32 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_logging.go +++ b/filter/awsv4upgrade/aws_s3_bucket_logging.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketLoggingFilter is a filter implementation for upgrading the -// logging argument of aws_s3_bucket. +// AWSS3BucketLoggingResourceFilter is a filter implementation for upgrading +// the logging argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#logging-argument -type AWSS3BucketLoggingFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketLoggingFilter)(nil) - -// NewAWSS3BucketLoggingFilter creates a new instance of AWSS3BucketLoggingFilter. -func NewAWSS3BucketLoggingFilter() tfeditor.ResourceFilter { - return &AWSS3BucketLoggingFilter{} -} - -// ResourceFilter upgrades the logging argument of aws_s3_bucket. -func (f *AWSS3BucketLoggingFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketLoggingResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "logging" newResourceType := "aws_s3_bucket_logging" diff --git a/filter/awsv4upgrade/aws_s3_bucket_logging_test.go b/filter/awsv4upgrade/aws_s3_bucket_logging_test.go index 99b67e4..e230e46 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_logging_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_logging_test.go @@ -76,7 +76,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketLoggingFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketLoggingResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration.go b/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration.go index 81194b2..fbd957d 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration.go +++ b/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration.go @@ -1,27 +1,14 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" "github.com/zclconf/go-cty/cty" ) -// AWSS3BucketObjectLockConfigurationFilter is a filter implementation for -// upgrading the object_lock_configuration argument of aws_s3_bucket. +// AWSS3BucketObjectLockConfigurationResourceFilter is a filter implementation +// for upgrading the object_lock_configuration argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#object_lock_configuration-rule-argument -type AWSS3BucketObjectLockConfigurationFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketObjectLockConfigurationFilter)(nil) - -// NewAWSS3BucketObjectLockConfigurationFilter creates a new instance of -// AWSS3BucketObjectLockConfigurationFilter. -func NewAWSS3BucketObjectLockConfigurationFilter() tfeditor.ResourceFilter { - return &AWSS3BucketObjectLockConfigurationFilter{} -} - -// ResourceFilter upgrades the object_lock_configuration argument of -// aws_s3_bucket. -func (f *AWSS3BucketObjectLockConfigurationFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketObjectLockConfigurationResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "object_lock_configuration" newResourceType := "aws_s3_bucket_object_lock_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration_test.go b/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration_test.go index ebefbbd..f425e34 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration_test.go @@ -73,7 +73,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketObjectLockConfigurationFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketObjectLockConfigurationResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_policy.go b/filter/awsv4upgrade/aws_s3_bucket_policy.go index 0d15712..3148b4d 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_policy.go +++ b/filter/awsv4upgrade/aws_s3_bucket_policy.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketPolicyFilter is a filter implementation for upgrading the policy -// argument of aws_s3_bucket. +// AWSS3BucketPolicyResourceFilter is a filter implementation for upgrading the +// policy argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#policy-argument -type AWSS3BucketPolicyFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketPolicyFilter)(nil) - -// NewAWSS3BucketPolicyFilter creates a new instance of AWSS3BucketPolicyFilter. -func NewAWSS3BucketPolicyFilter() tfeditor.ResourceFilter { - return &AWSS3BucketPolicyFilter{} -} - -// ResourceFilter upgrades the policy argument of aws_s3_bucket. -func (f *AWSS3BucketPolicyFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketPolicyResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldAttribute := "policy" newResourceType := "aws_s3_bucket_policy" diff --git a/filter/awsv4upgrade/aws_s3_bucket_policy_test.go b/filter/awsv4upgrade/aws_s3_bucket_policy_test.go index bdf4232..c361507 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_policy_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_policy_test.go @@ -87,7 +87,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketPolicyFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketPolicyResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_replication_configuration.go b/filter/awsv4upgrade/aws_s3_bucket_replication_configuration.go index c7ea040..3f55a05 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_replication_configuration.go +++ b/filter/awsv4upgrade/aws_s3_bucket_replication_configuration.go @@ -1,26 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketReplicationConfigurationFilter is a filter implementation for -// upgrading the replication_configuration argument of aws_s3_bucket. +// AWSS3BucketReplicationConfigurationResourceFilter is a filter implementation +// for upgrading the replication_configuration argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#replication_configuration-argument -type AWSS3BucketReplicationConfigurationFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketReplicationConfigurationFilter)(nil) - -// NewAWSS3BucketReplicationConfigurationFilter creates a new instance of -// AWSS3BucketReplicationConfigurationFilter. -func NewAWSS3BucketReplicationConfigurationFilter() tfeditor.ResourceFilter { - return &AWSS3BucketReplicationConfigurationFilter{} -} - -// ResourceFilter upgrades the replication_configuration argument of -// aws_s3_bucket. -func (f *AWSS3BucketReplicationConfigurationFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketReplicationConfigurationResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "replication_configuration" newResourceType := "aws_s3_bucket_replication_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_replication_configuration_test.go b/filter/awsv4upgrade/aws_s3_bucket_replication_configuration_test.go index 6add064..ee098f7 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_replication_configuration_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_replication_configuration_test.go @@ -131,7 +131,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketReplicationConfigurationFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketReplicationConfigurationResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_request_payer.go b/filter/awsv4upgrade/aws_s3_bucket_request_payer.go index a1cb396..1de6539 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_request_payer.go +++ b/filter/awsv4upgrade/aws_s3_bucket_request_payer.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketRequestPayerFilter is a filter implementation for upgrading -// the request_payer argument of aws_s3_bucket. +// AWSS3BucketRequestPayerResourceFilter is a filter implementation for +// upgrading the request_payer argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#request_payer-argument -type AWSS3BucketRequestPayerFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketRequestPayerFilter)(nil) - -// NewAWSS3BucketRequestPayerFilter creates a new instance of AWSS3BucketRequestPayerFilter. -func NewAWSS3BucketRequestPayerFilter() tfeditor.ResourceFilter { - return &AWSS3BucketRequestPayerFilter{} -} - -// ResourceFilter upgrades the request_payer argument of aws_s3_bucket. -func (f *AWSS3BucketRequestPayerFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketRequestPayerResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldAttribute := "request_payer" newResourceType := "aws_s3_bucket_request_payment_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_request_payer_test.go b/filter/awsv4upgrade/aws_s3_bucket_request_payer_test.go index 95a6252..c549ef7 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_request_payer_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_request_payer_test.go @@ -55,7 +55,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketRequestPayerFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketRequestPayerResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration.go b/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration.go index 227c0fc..13f3a2a 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration.go +++ b/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration.go @@ -1,27 +1,14 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketServerSideEncryptionConfigurationFilter is a filter +// AWSS3BucketServerSideEncryptionConfigurationResourceFilter is a filter // implementation for upgrading the server_side_encryption_configuration // argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#server_side_encryption_configuration-argument -type AWSS3BucketServerSideEncryptionConfigurationFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketServerSideEncryptionConfigurationFilter)(nil) - -// NewAWSS3BucketServerSideEncryptionConfigurationFilter creates a new instance -// of AWSS3BucketServerSideEncryptionConfigurationFilter. -func NewAWSS3BucketServerSideEncryptionConfigurationFilter() tfeditor.ResourceFilter { - return &AWSS3BucketServerSideEncryptionConfigurationFilter{} -} - -// ResourceFilter upgrades the server_side_encryption_configuration argument of -// aws_s3_bucket. -func (f *AWSS3BucketServerSideEncryptionConfigurationFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketServerSideEncryptionConfigurationResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "server_side_encryption_configuration" newResourceType := "aws_s3_bucket_server_side_encryption_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration_test.go b/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration_test.go index 9cd536d..2b5d1bf 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_server_side_encryption_configuration_test.go @@ -70,7 +70,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketServerSideEncryptionConfigurationFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketServerSideEncryptionConfigurationResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_versioning.go b/filter/awsv4upgrade/aws_s3_bucket_versioning.go index 50c6c85..1f4e29d 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_versioning.go +++ b/filter/awsv4upgrade/aws_s3_bucket_versioning.go @@ -1,25 +1,14 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" "github.com/zclconf/go-cty/cty" ) -// AWSS3BucketVersioningFilter is a filter implementation for upgrading the -// versioning argument of aws_s3_bucket. +// AWSS3BucketVersioningResourceFilter is a filter implementation for upgrading +// the versioning argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#versioning-argument -type AWSS3BucketVersioningFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketVersioningFilter)(nil) - -// NewAWSS3BucketVersioningFilter creates a new instance of AWSS3BucketVersioningFilter. -func NewAWSS3BucketVersioningFilter() tfeditor.ResourceFilter { - return &AWSS3BucketVersioningFilter{} -} - -// ResourceFilter upgrades the versioning argument of aws_s3_bucket. -func (f *AWSS3BucketVersioningFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketVersioningResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "versioning" newResourceType := "aws_s3_bucket_versioning" newNestedBlock := "versioning_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_versioning_test.go b/filter/awsv4upgrade/aws_s3_bucket_versioning_test.go index 93433bc..6a5b8cd 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_versioning_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_versioning_test.go @@ -174,7 +174,11 @@ resource "aws_s3_bucket_versioning" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketVersioningFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketVersioningResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/filter/awsv4upgrade/aws_s3_bucket_website.go b/filter/awsv4upgrade/aws_s3_bucket_website.go index d1db3e6..d9196f7 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_website.go +++ b/filter/awsv4upgrade/aws_s3_bucket_website.go @@ -1,24 +1,13 @@ package awsv4upgrade import ( - "github.com/minamijoyo/tfedit/tfeditor" "github.com/minamijoyo/tfedit/tfwrite" ) -// AWSS3BucketWebsiteFilter is a filter implementation for upgrading the -// website argument of aws_s3_bucket. +// AWSS3BucketWebsiteResourceFilter is a filter implementation for upgrading +// the website argument of aws_s3_bucket. // https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#website-website_domain-and-website_endpoint-arguments -type AWSS3BucketWebsiteFilter struct{} - -var _ tfeditor.ResourceFilter = (*AWSS3BucketWebsiteFilter)(nil) - -// NewAWSS3BucketWebsiteFilter creates a new instance of AWSS3BucketWebsiteFilter. -func NewAWSS3BucketWebsiteFilter() tfeditor.ResourceFilter { - return &AWSS3BucketWebsiteFilter{} -} - -// ResourceFilter upgrades the website argument of aws_s3_bucket. -func (f *AWSS3BucketWebsiteFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { +func AWSS3BucketWebsiteResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { oldNestedBlock := "website" newResourceType := "aws_s3_bucket_website_configuration" diff --git a/filter/awsv4upgrade/aws_s3_bucket_website_test.go b/filter/awsv4upgrade/aws_s3_bucket_website_test.go index 9115d2f..2d3d026 100644 --- a/filter/awsv4upgrade/aws_s3_bucket_website_test.go +++ b/filter/awsv4upgrade/aws_s3_bucket_website_test.go @@ -68,7 +68,11 @@ resource "aws_s3_bucket" "example" { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketWebsiteFilter{}}} + filter := &AWSS3BucketFilter{ + filters: []tfeditor.BlockFilter{ + tfeditor.ResourceFilterFunc(AWSS3BucketWebsiteResourceFilter), + }, + } o := editor.NewEditOperator(filter) output, err := o.Apply([]byte(tc.src), "test") if tc.ok && err != nil { diff --git a/tfeditor/filter_block.go b/tfeditor/filter_block.go new file mode 100644 index 0000000..cbf0642 --- /dev/null +++ b/tfeditor/filter_block.go @@ -0,0 +1,82 @@ +package tfeditor + +import ( + "github.com/hashicorp/hcl/v2/hclwrite" + "github.com/minamijoyo/hcledit/editor" + "github.com/minamijoyo/tfedit/tfwrite" +) + +// BlockFilter is an interface which reads Terraform configuration and +// rewrite a given block, and writes Terraform configuration. +type BlockFilter interface { + // BlockFilter reads Terraform configuration and rewrite a given block, + // and writes Terraform configuration. + BlockFilter(*tfwrite.File, tfwrite.Block) (*tfwrite.File, error) +} + +type BlockFilterFunc func(*tfwrite.File, tfwrite.Block) (*tfwrite.File, error) + +func (f BlockFilterFunc) BlockFilter(inFile *tfwrite.File, block tfwrite.Block) (*tfwrite.File, error) { + return f(inFile, block) +} + +// MultiBlockFilter is a BlockFilter implementation which applies +// multiple block filters to a given block in sequence. +type MultiBlockFilter struct { + filters []BlockFilter +} + +var _ BlockFilter = (*MultiBlockFilter)(nil) + +// NewMultiBlockFilter creates a new instance of MultiBlockFilter. +func NewMultiBlockFilter(filters []BlockFilter) BlockFilter { + return &MultiBlockFilter{ + filters: filters, + } +} + +// BlockFilter applies multiple filters to a given block in sequence. +func (f *MultiBlockFilter) BlockFilter(inFile *tfwrite.File, block tfwrite.Block) (*tfwrite.File, error) { + current := inFile + for _, f := range f.filters { + next, err := f.BlockFilter(current, block) + if err != nil { + return nil, err + } + current = next + } + return current, nil +} + +// BlocksByTypeFilter is a Filter implementation for applying a filter to +// multiple blocks with a given block type. +type BlocksByTypeFilter struct { + blockType string + schemaType string + filter BlockFilter +} + +var _ editor.Filter = (*BlocksByTypeFilter)(nil) + +// NewBlocksByTypeFilter creates a new instance of BlocksByTypeFilter. +func NewBlocksByTypeFilter(blockType string, schemaType string, filter BlockFilter) editor.Filter { + return &BlocksByTypeFilter{ + blockType: blockType, + schemaType: schemaType, + filter: filter, + } +} + +// Filter applies a filter to multiple blocks with a given block type. +func (f *BlocksByTypeFilter) Filter(inFile *hclwrite.File) (*hclwrite.File, error) { + current := tfwrite.NewFile(inFile) + blocks := current.FindBlocksByType(f.blockType, f.schemaType) + for _, block := range blocks { + next, err := f.filter.BlockFilter(current, block) + if err != nil { + return nil, err + } + current = next + } + return current.Raw(), nil +} diff --git a/tfeditor/filter_resource.go b/tfeditor/filter_resource.go index 4d13cc2..2481b6d 100644 --- a/tfeditor/filter_resource.go +++ b/tfeditor/filter_resource.go @@ -1,6 +1,8 @@ package tfeditor import ( + "fmt" + "github.com/hashicorp/hcl/v2/hclwrite" "github.com/minamijoyo/hcledit/editor" "github.com/minamijoyo/tfedit/tfwrite" @@ -14,6 +16,16 @@ type ResourceFilter interface { ResourceFilter(*tfwrite.File, *tfwrite.Resource) (*tfwrite.File, error) } +type ResourceFilterFunc func(*tfwrite.File, *tfwrite.Resource) (*tfwrite.File, error) + +func (f ResourceFilterFunc) BlockFilter(inFile *tfwrite.File, block tfwrite.Block) (*tfwrite.File, error) { + resource, ok := block.(*tfwrite.Resource) + if !ok { + return nil, fmt.Errorf("failed to cast Block as Resource: %#v", block) + } + return f(inFile, resource) +} + // MultiResourceFilter is a ResourceFilter implementation which applies // multiple resource filters to a given resource in sequence. type MultiResourceFilter struct { diff --git a/tfeditor/filter_vertical_formatter.go b/tfeditor/filter_vertical_formatter.go index 6bb8ff0..f9fa699 100644 --- a/tfeditor/filter_vertical_formatter.go +++ b/tfeditor/filter_vertical_formatter.go @@ -9,18 +9,8 @@ import ( // formatting. However, it's useful in some cases such as removing a block // because leading and trailing newline tokens don't belong to a block, so // deleting a block leaves extra newline tokens. -type VerticalFormatterFilter struct{} - -var _ ResourceFilter = (*VerticalFormatterFilter)(nil) - -// NewVerticalFormatterResourceFilter creates a new instance of VerticalFormatterFilter as ResourceFilter. -func NewVerticalFormatterResourceFilter() ResourceFilter { - return &VerticalFormatterFilter{} -} - -// ResourceFilter reads HCL and writes formatted contents in vertical. -func (f *VerticalFormatterFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) { - resource.VerticalFormat() +func VerticalFormatterFilter(inFile *tfwrite.File, block tfwrite.Block) (*tfwrite.File, error) { + block.VerticalFormat() return inFile, nil } diff --git a/tfwrite/file.go b/tfwrite/file.go index 5ca717e..949f906 100644 --- a/tfwrite/file.go +++ b/tfwrite/file.go @@ -23,10 +23,10 @@ func (f *File) Raw() *hclwrite.File { return f.raw } -// findBlocksByType returns all matching blocks from the body that have the +// FindBlocksByType returns all matching blocks from the body that have the // given blockType and schemaType or returns an empty list if not found. // If the given schemaType is a non-empty string, filter the results. -func (f *File) findBlocksByType(blockType string, schemaType string) []Block { +func (f *File) FindBlocksByType(blockType string, schemaType string) []Block { var blocks []Block for _, block := range f.Raw().Body().Blocks() { @@ -58,7 +58,7 @@ func (f *File) findBlocksByType(blockType string, schemaType string) []Block { func (f *File) FindResourcesByType(schemaType string) []*Resource { var matched []*Resource - for _, block := range f.findBlocksByType("resource", schemaType) { + for _, block := range f.FindBlocksByType("resource", schemaType) { b := block.(*Resource) matched = append(matched, b) } @@ -71,7 +71,7 @@ func (f *File) FindResourcesByType(schemaType string) []*Resource { func (f *File) FindDataSourcesByType(schemaType string) []*DataSource { var matched []*DataSource - for _, block := range f.findBlocksByType("data", schemaType) { + for _, block := range f.FindBlocksByType("data", schemaType) { b := block.(*DataSource) matched = append(matched, b) } @@ -84,7 +84,7 @@ func (f *File) FindDataSourcesByType(schemaType string) []*DataSource { func (f *File) FindProvidersByType(schemaType string) []*Provider { var matched []*Provider - for _, block := range f.findBlocksByType("provider", schemaType) { + for _, block := range f.FindBlocksByType("provider", schemaType) { b := block.(*Provider) matched = append(matched, b) }