github.com/jpreese/tflint@v0.19.2-0.20200908152133-b01686250fb6/plugin/encode.go (about)

     1  package plugin
     2  
     3  import (
     4  	hcl "github.com/hashicorp/hcl/v2"
     5  	"github.com/hashicorp/terraform/configs"
     6  	"github.com/terraform-linters/tflint-plugin-sdk/terraform"
     7  	tfplugin "github.com/terraform-linters/tflint-plugin-sdk/tflint/client"
     8  	"github.com/terraform-linters/tflint/tflint"
     9  )
    10  
    11  func (s *Server) encodeResource(resource *configs.Resource) *tfplugin.Resource {
    12  	configRange := tflint.HCLBodyRange(resource.Config, resource.DeclRange)
    13  
    14  	var count []byte
    15  	var countRange hcl.Range
    16  	if resource.Count != nil {
    17  		count = resource.Count.Range().SliceBytes(s.runner.File(resource.Count.Range().Filename).Bytes)
    18  		countRange = resource.Count.Range()
    19  	}
    20  
    21  	var forEach []byte
    22  	var forEachRange hcl.Range
    23  	if resource.ForEach != nil {
    24  		forEach = resource.ForEach.Range().SliceBytes(s.runner.File(resource.ForEach.Range().Filename).Bytes)
    25  		forEachRange = resource.ForEach.Range()
    26  	}
    27  
    28  	return &tfplugin.Resource{
    29  		Mode:         terraform.ResourceMode(resource.Mode),
    30  		Name:         resource.Name,
    31  		Type:         resource.Type,
    32  		Config:       configRange.SliceBytes(s.runner.File(configRange.Filename).Bytes),
    33  		ConfigRange:  configRange,
    34  		Count:        count,
    35  		CountRange:   countRange,
    36  		ForEach:      forEach,
    37  		ForEachRange: forEachRange,
    38  
    39  		ProviderConfigRef: s.encodeProviderConfigRef(resource.ProviderConfigRef),
    40  		Provider: terraform.Provider{
    41  			Type:      resource.Provider.Type,
    42  			Namespace: resource.Provider.Namespace,
    43  			Hostname:  resource.Provider.Hostname,
    44  		},
    45  
    46  		Managed: s.encodeManagedResource(resource.Managed),
    47  
    48  		DeclRange: resource.DeclRange,
    49  		TypeRange: resource.TypeRange,
    50  	}
    51  }
    52  
    53  func (s *Server) encodeManagedResource(resource *configs.ManagedResource) *tfplugin.ManagedResource {
    54  	provisioners := make([]*tfplugin.Provisioner, len(resource.Provisioners))
    55  	for i, provisioner := range resource.Provisioners {
    56  		provisioners[i] = s.encodeProvisioner(provisioner)
    57  	}
    58  
    59  	return &tfplugin.ManagedResource{
    60  		Connection:   s.encodeConnection(resource.Connection),
    61  		Provisioners: provisioners,
    62  
    63  		CreateBeforeDestroy: resource.CreateBeforeDestroy,
    64  		PreventDestroy:      resource.PreventDestroy,
    65  		IgnoreAllChanges:    resource.IgnoreAllChanges,
    66  
    67  		CreateBeforeDestroySet: resource.CreateBeforeDestroySet,
    68  		PreventDestroySet:      resource.PreventDestroySet,
    69  	}
    70  }
    71  
    72  func (s *Server) encodeModuleCall(call *configs.ModuleCall) *tfplugin.ModuleCall {
    73  	configRange := tflint.HCLBodyRange(call.Config, call.DeclRange)
    74  
    75  	var count []byte
    76  	var countRange hcl.Range
    77  	if call.Count != nil {
    78  		count = call.Count.Range().SliceBytes(s.runner.File(call.Count.Range().Filename).Bytes)
    79  		countRange = call.Count.Range()
    80  	}
    81  
    82  	var forEach []byte
    83  	var forEachRange hcl.Range
    84  	if call.ForEach != nil {
    85  		forEach = call.ForEach.Range().SliceBytes(s.runner.File(call.ForEach.Range().Filename).Bytes)
    86  		forEachRange = call.ForEach.Range()
    87  	}
    88  
    89  	providers := []tfplugin.PassedProviderConfig{}
    90  	for _, provider := range call.Providers {
    91  		providers = append(providers, tfplugin.PassedProviderConfig{
    92  			InChild:  s.encodeProviderConfigRef(provider.InChild),
    93  			InParent: s.encodeProviderConfigRef(provider.InParent),
    94  		})
    95  	}
    96  
    97  	version := call.Version.Required.String()
    98  
    99  	return &tfplugin.ModuleCall{
   100  		Name: call.Name,
   101  
   102  		SourceAddr:      call.SourceAddr,
   103  		SourceAddrRange: call.SourceAddrRange,
   104  		SourceSet:       call.SourceSet,
   105  
   106  		Version:      version,
   107  		VersionRange: call.Version.DeclRange,
   108  
   109  		Config:      configRange.SliceBytes(s.runner.File(configRange.Filename).Bytes),
   110  		ConfigRange: configRange,
   111  
   112  		Count:        count,
   113  		CountRange:   countRange,
   114  		ForEach:      forEach,
   115  		ForEachRange: forEachRange,
   116  
   117  		Providers: providers,
   118  		DeclRange: call.DeclRange,
   119  	}
   120  }
   121  
   122  func (s *Server) encodeProviderConfigRef(ref *configs.ProviderConfigRef) *terraform.ProviderConfigRef {
   123  	if ref == nil {
   124  		return nil
   125  	}
   126  
   127  	return &terraform.ProviderConfigRef{
   128  		Name:       ref.Name,
   129  		NameRange:  ref.NameRange,
   130  		Alias:      ref.Alias,
   131  		AliasRange: ref.AliasRange,
   132  	}
   133  }
   134  
   135  func (s *Server) encodeConnection(connection *configs.Connection) *tfplugin.Connection {
   136  	if connection == nil {
   137  		return nil
   138  	}
   139  
   140  	configRange := tflint.HCLBodyRange(connection.Config, connection.DeclRange)
   141  
   142  	return &tfplugin.Connection{
   143  		Config:      configRange.SliceBytes(s.runner.File(configRange.Filename).Bytes),
   144  		ConfigRange: configRange,
   145  
   146  		DeclRange: connection.DeclRange,
   147  	}
   148  }
   149  
   150  func (s *Server) encodeProvisioner(provisioner *configs.Provisioner) *tfplugin.Provisioner {
   151  	configRange := tflint.HCLBodyRange(provisioner.Config, provisioner.DeclRange)
   152  
   153  	return &tfplugin.Provisioner{
   154  		Type:        provisioner.Type,
   155  		Config:      configRange.SliceBytes(s.runner.File(configRange.Filename).Bytes),
   156  		ConfigRange: configRange,
   157  		Connection:  s.encodeConnection(provisioner.Connection),
   158  		When:        terraform.ProvisionerWhen(provisioner.When),
   159  		OnFailure:   terraform.ProvisionerOnFailure(provisioner.OnFailure),
   160  
   161  		DeclRange: provisioner.DeclRange,
   162  		TypeRange: provisioner.TypeRange,
   163  	}
   164  }
   165  
   166  func (s *Server) encodeBackend(backend *configs.Backend) *tfplugin.Backend {
   167  	configRange := tflint.HCLBodyRange(backend.Config, backend.DeclRange)
   168  	config := []byte{}
   169  	if configRange.Empty() {
   170  		configRange.Filename = backend.DeclRange.Filename
   171  	} else {
   172  		config = configRange.SliceBytes(s.runner.File(configRange.Filename).Bytes)
   173  	}
   174  
   175  	return &tfplugin.Backend{
   176  		Type:        backend.Type,
   177  		Config:      config,
   178  		ConfigRange: configRange,
   179  		DeclRange:   backend.DeclRange,
   180  		TypeRange:   backend.TypeRange,
   181  	}
   182  }