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 }