Skip to content

Commit

Permalink
Use BlockFilter instead of ResourceFilter
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
minamijoyo committed Nov 28, 2022
1 parent 5ed5e0f commit b8296e8
Show file tree
Hide file tree
Showing 31 changed files with 226 additions and 238 deletions.
43 changes: 22 additions & 21 deletions filter/awsv4upgrade/aws_s3_bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_acceleration_status.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_acl.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
6 changes: 5 additions & 1 deletion filter/awsv4upgrade/aws_s3_bucket_acl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_cors_rule.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
6 changes: 5 additions & 1 deletion filter/awsv4upgrade/aws_s3_bucket_cors_rule_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_grant.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
6 changes: 5 additions & 1 deletion filter/awsv4upgrade/aws_s3_bucket_grant_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
6 changes: 5 additions & 1 deletion filter/awsv4upgrade/aws_s3_bucket_lifecycle_rule_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_logging.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
6 changes: 5 additions & 1 deletion filter/awsv4upgrade/aws_s3_bucket_logging_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
19 changes: 3 additions & 16 deletions filter/awsv4upgrade/aws_s3_bucket_object_lock_configuration.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
17 changes: 3 additions & 14 deletions filter/awsv4upgrade/aws_s3_bucket_policy.go
Original file line number Diff line number Diff line change
@@ -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"

Expand Down
Loading

0 comments on commit b8296e8

Please sign in to comment.