| // Copyright IBM Corp. 2019, 2026 | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package tfjson | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| ) | |
| // Config represents the complete configuration source. | |
| type Config struct { | |
| // A map of all provider instances across all modules in the | |
| // configuration. | |
| // | |
| // The index for this field is opaque and should not be parsed. Use | |
| // the individual fields in ProviderConfig to discern actual data | |
| // about the provider such as name, alias, or defined module. | |
| ProviderConfigs map[string]*ProviderConfig `json:"provider_config,omitempty"` | |
| // The root module in the configuration. Any child modules descend | |
| // off of here. | |
| RootModule *ConfigModule `json:"root_module,omitempty"` | |
| } | |
| // Validate checks to ensure that the config is present. | |
| func (c *Config) Validate() error { | |
| if c == nil { | |
| return errors.New("config is nil") | |
| } | |
| return nil | |
| } | |
| // UnmarshalJSON implements json.Unmarshaler for Config. | |
| // | |
| // As per established convention this method should only ever | |
| // be invoked *indirectly* via [encoding/json] library. | |
| func (c *Config) UnmarshalJSON(b []byte) error { | |
| type rawConfig Config | |
| var config rawConfig | |
| err := json.Unmarshal(b, &config) | |
| if err != nil { | |
| return err | |
| } | |
| *c = *(*Config)(&config) | |
| return c.Validate() | |
| } | |
| // ProviderConfig describes a provider configuration instance. | |
| type ProviderConfig struct { | |
| // The name of the provider, ie: "aws". | |
| Name string `json:"name,omitempty"` | |
| // The fully-specified name of the provider, ie: "registry.terraform.io/hashicorp/aws". | |
| FullName string `json:"full_name,omitempty"` | |
| // The alias of the provider, ie: "us-east-1". | |
| Alias string `json:"alias,omitempty"` | |
| // The address of the module the provider is declared in. | |
| ModuleAddress string `json:"module_address,omitempty"` | |
| // Any non-special configuration values in the provider, indexed by | |
| // key. | |
| Expressions map[string]*Expression `json:"expressions,omitempty"` | |
| // The defined version constraint for this provider. | |
| VersionConstraint string `json:"version_constraint,omitempty"` | |
| } | |
| // ConfigModule describes a module in Terraform configuration. | |
| type ConfigModule struct { | |
| // The outputs defined in the module. | |
| Outputs map[string]*ConfigOutput `json:"outputs,omitempty"` | |
| // The resources defined in the module. | |
| Resources []*ConfigResource `json:"resources,omitempty"` | |
| // Any "module" stanzas within the specific module. | |
| ModuleCalls map[string]*ModuleCall `json:"module_calls,omitempty"` | |
| // The variables defined in the module. | |
| Variables map[string]*ConfigVariable `json:"variables,omitempty"` | |
| } | |
| // ConfigOutput defines an output as defined in configuration. | |
| type ConfigOutput struct { | |
| // Indicates whether or not the output was marked as sensitive. | |
| Sensitive bool `json:"sensitive,omitempty"` | |
| // The defined value of the output. | |
| Expression *Expression `json:"expression,omitempty"` | |
| // The defined description of this output. | |
| Description string `json:"description,omitempty"` | |
| // The defined dependencies tied to this output. | |
| DependsOn []string `json:"depends_on,omitempty"` | |
| } | |
| // ConfigResource is the configuration representation of a resource. | |
| type ConfigResource struct { | |
| // The address of the resource relative to the module that it is | |
| // in. | |
| Address string `json:"address,omitempty"` | |
| // The resource mode. | |
| Mode ResourceMode `json:"mode,omitempty"` | |
| // The type of resource, ie: "null_resource" in | |
| // "null_resource.foo". | |
| Type string `json:"type,omitempty"` | |
| // The name of the resource, ie: "foo" in "null_resource.foo". | |
| Name string `json:"name,omitempty"` | |
| // An opaque key representing the provider configuration this | |
| // module uses. Note that there are more than one circumstance that | |
| // this key will not match what is found in the ProviderConfigs | |
| // field in the root Config structure, and as such should not be | |
| // relied on for that purpose. | |
| ProviderConfigKey string `json:"provider_config_key,omitempty"` | |
| // The list of provisioner defined for this configuration. This | |
| // will be nil if no providers are defined. | |
| Provisioners []*ConfigProvisioner `json:"provisioners,omitempty"` | |
| // Any non-special configuration values in the resource, indexed by | |
| // key. | |
| Expressions map[string]*Expression `json:"expressions,omitempty"` | |
| // The resource's configuration schema version. With access to the | |
| // specific Terraform provider for this resource, this can be used | |
| // to determine the correct schema for the configuration data | |
| // supplied in Expressions. | |
| SchemaVersion uint64 `json:"schema_version"` | |
| // The expression data for the "count" value in the resource. | |
| CountExpression *Expression `json:"count_expression,omitempty"` | |
| // The expression data for the "for_each" value in the resource. | |
| ForEachExpression *Expression `json:"for_each_expression,omitempty"` | |
| // The contents of the "depends_on" config directive, which | |
| // declares explicit dependencies for this resource. | |
| DependsOn []string `json:"depends_on,omitempty"` | |
| } | |
| // ConfigVariable defines a variable as defined in configuration. | |
| type ConfigVariable struct { | |
| // The defined default value of the variable. | |
| Default interface{} `json:"default,omitempty"` | |
| // The defined text description of the variable. | |
| Description string `json:"description,omitempty"` | |
| // Whether the variable is marked as sensitive | |
| Sensitive bool `json:"sensitive,omitempty"` | |
| } | |
| // ConfigProvisioner describes a provisioner declared in a resource | |
| // configuration. | |
| type ConfigProvisioner struct { | |
| // The type of the provisioner, ie: "local-exec". | |
| Type string `json:"type,omitempty"` | |
| // Any non-special configuration values in the provisioner, indexed by | |
| // key. | |
| Expressions map[string]*Expression `json:"expressions,omitempty"` | |
| } | |
| // ModuleCall describes a declared "module" within a configuration. | |
| // It also contains the data for the module itself. | |
| type ModuleCall struct { | |
| // The contents of the "source" field. | |
| Source string `json:"source,omitempty"` | |
| // Any non-special configuration values in the module, indexed by | |
| // key. | |
| Expressions map[string]*Expression `json:"expressions,omitempty"` | |
| // The expression data for the "count" value in the module. | |
| CountExpression *Expression `json:"count_expression,omitempty"` | |
| // The expression data for the "for_each" value in the module. | |
| ForEachExpression *Expression `json:"for_each_expression,omitempty"` | |
| // The configuration data for the module itself. | |
| Module *ConfigModule `json:"module,omitempty"` | |
| // The version constraint for modules that come from the registry. | |
| VersionConstraint string `json:"version_constraint,omitempty"` | |
| // The explicit resource dependencies for the "depends_on" value. | |
| // As it must be a slice of references, Expression is not used. | |
| DependsOn []string `json:"depends_on,omitempty"` | |
| } |