You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
terraform/internal/stacks/stackaddrs/provider_config.go

97 lines
3.1 KiB

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package stackaddrs
import (
"fmt"
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/collections"
)
// ProviderConfigRef is a reference-only address type representing a reference
// to a particular provider configuration using its local name, since local
// name is how we refer to providers when they appear in expressions.
//
// The referent of a ProviderConfigRef is a [ProviderConfig], so resolving
// the reference will always require a lookup table from local name to
// fully-qualified provider address.
type ProviderConfigRef struct {
ProviderLocalName string
Name string
}
func (ProviderConfigRef) referenceableSigil() {}
func (r ProviderConfigRef) String() string {
return "provider." + r.ProviderLocalName + "." + r.Name
}
// ProviderConfig is the address of a "provider" block in a stack configuration.
type ProviderConfig struct {
Provider addrs.Provider
Name string
}
func (ProviderConfig) inStackConfigSigil() {}
func (ProviderConfig) inStackInstanceSigil() {}
func (c ProviderConfig) String() string {
return fmt.Sprintf("provider[%q].%s", c.Provider, c.Name)
}
func (v ProviderConfig) UniqueKey() collections.UniqueKey[ProviderConfig] {
return v
}
// A ProviderConfig is its own [collections.UniqueKey].
func (ProviderConfig) IsUniqueKey(ProviderConfig) {}
// ConfigProviderConfig places a [ProviderConfig] in the context of a particular [Stack].
type ConfigProviderConfig = InStackConfig[ProviderConfig]
// AbsProviderConfig places a [ProviderConfig] in the context of a particular [StackInstance].
type AbsProviderConfig = InStackInstance[ProviderConfig]
// ProviderConfigInstance is the address of a specific provider configuration,
// of which there might potentially be many associated with a given
// [ProviderConfig] if that block uses the "for_each" argument.
type ProviderConfigInstance struct {
ProviderConfig ProviderConfig
Key addrs.InstanceKey
}
func (ProviderConfigInstance) inStackConfigSigil() {}
func (ProviderConfigInstance) inStackInstanceSigil() {}
func (c ProviderConfigInstance) String() string {
if c.Key == nil {
return c.ProviderConfig.String()
}
return c.ProviderConfig.String() + c.Key.String()
}
func (v ProviderConfigInstance) UniqueKey() collections.UniqueKey[ProviderConfigInstance] {
return v
}
// A ProviderConfigInstance is its own [collections.UniqueKey].
func (ProviderConfigInstance) IsUniqueKey(ProviderConfigInstance) {}
// ConfigProviderConfigInstance places a [ProviderConfigInstance] in the context of a particular [Stack].
type ConfigProviderConfigInstance = InStackConfig[ProviderConfigInstance]
// AbsProviderConfigInstance places a [ProviderConfigInstance] in the context of a particular [StackInstance].
type AbsProviderConfigInstance = InStackInstance[ProviderConfigInstance]
func AbsProviderToInstance(addr AbsProviderConfig, ik addrs.InstanceKey) AbsProviderConfigInstance {
return AbsProviderConfigInstance{
Stack: addr.Stack,
Item: ProviderConfigInstance{
ProviderConfig: addr.Item,
Key: ik,
},
}
}