// Copyright (c) HashiCorp, Inc. // 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 } 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"` }