blob: b73f1e054dce892f9ed90307f917dddde3e190c0 [file] [log] [blame] [edit]
// 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,
},
}
}