mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-12 09:01:58 -06:00
22eee529e3
We previously built out addrs.UnifyMoveEndpoints with a different implementation strategy in mind, but that design turns out to not be viable because it forces us to move to AbsMoveable addresses too soon, before we've done the analysis required to identify chained and nested moves. Instead, UnifyMoveEndpoints will return a new type MoveEndpointInModule which conceptually represents a matching pattern which either matches or doesn't match a particular AbsMoveable. It does this by just binding the unified relative address from the MoveEndpoint to the module where it was declared, and thus allows us to distinguish between the part of the module path which applies to any instances of the given modules vs. the user-specified part which must identify particular module instances.
177 lines
4.6 KiB
Go
177 lines
4.6 KiB
Go
package addrs
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// ModuleCall is the address of a call from the current module to a child
|
|
// module.
|
|
type ModuleCall struct {
|
|
referenceable
|
|
Name string
|
|
}
|
|
|
|
func (c ModuleCall) String() string {
|
|
return "module." + c.Name
|
|
}
|
|
|
|
func (c ModuleCall) UniqueKey() UniqueKey {
|
|
return c // A ModuleCall is its own UniqueKey
|
|
}
|
|
|
|
func (c ModuleCall) uniqueKeySigil() {}
|
|
|
|
// Instance returns the address of an instance of the receiver identified by
|
|
// the given key.
|
|
func (c ModuleCall) Instance(key InstanceKey) ModuleCallInstance {
|
|
return ModuleCallInstance{
|
|
Call: c,
|
|
Key: key,
|
|
}
|
|
}
|
|
|
|
func (c ModuleCall) Absolute(moduleAddr ModuleInstance) AbsModuleCall {
|
|
return AbsModuleCall{
|
|
Module: moduleAddr,
|
|
Call: c,
|
|
}
|
|
}
|
|
|
|
// AbsModuleCall is the address of a "module" block relative to the root
|
|
// of the configuration.
|
|
//
|
|
// This is similar to ModuleInstance alone, but specifically represents
|
|
// the module block itself rather than any one of the instances that
|
|
// module block declares.
|
|
type AbsModuleCall struct {
|
|
Module ModuleInstance
|
|
Call ModuleCall
|
|
}
|
|
|
|
func (c AbsModuleCall) absMoveableSigil() {
|
|
// AbsModuleCall is "moveable".
|
|
}
|
|
|
|
func (c AbsModuleCall) String() string {
|
|
if len(c.Module) == 0 {
|
|
return "module." + c.Call.Name
|
|
|
|
}
|
|
return fmt.Sprintf("%s.module.%s", c.Module, c.Call.Name)
|
|
}
|
|
|
|
func (c AbsModuleCall) Instance(key InstanceKey) ModuleInstance {
|
|
ret := make(ModuleInstance, len(c.Module), len(c.Module)+1)
|
|
copy(ret, c.Module)
|
|
ret = append(ret, ModuleInstanceStep{
|
|
Name: c.Call.Name,
|
|
InstanceKey: key,
|
|
})
|
|
return ret
|
|
}
|
|
|
|
// ModuleCallInstance is the address of one instance of a module created from
|
|
// a module call, which might create multiple instances using "count" or
|
|
// "for_each" arguments.
|
|
//
|
|
// There is no "Abs" version of ModuleCallInstance because an absolute module
|
|
// path is represented by ModuleInstance.
|
|
type ModuleCallInstance struct {
|
|
referenceable
|
|
Call ModuleCall
|
|
Key InstanceKey
|
|
}
|
|
|
|
func (c ModuleCallInstance) String() string {
|
|
if c.Key == NoKey {
|
|
return c.Call.String()
|
|
}
|
|
return fmt.Sprintf("module.%s%s", c.Call.Name, c.Key)
|
|
}
|
|
|
|
func (c ModuleCallInstance) UniqueKey() UniqueKey {
|
|
return c // A ModuleCallInstance is its own UniqueKey
|
|
}
|
|
|
|
func (c ModuleCallInstance) uniqueKeySigil() {}
|
|
|
|
func (c ModuleCallInstance) Absolute(moduleAddr ModuleInstance) ModuleInstance {
|
|
ret := make(ModuleInstance, len(moduleAddr), len(moduleAddr)+1)
|
|
copy(ret, moduleAddr)
|
|
ret = append(ret, ModuleInstanceStep{
|
|
Name: c.Call.Name,
|
|
InstanceKey: c.Key,
|
|
})
|
|
return ret
|
|
}
|
|
|
|
// ModuleInstance returns the address of the module instance that corresponds
|
|
// to the receiving call instance when resolved in the given calling module.
|
|
// In other words, it returns the child module instance that the receving
|
|
// call instance creates.
|
|
func (c ModuleCallInstance) ModuleInstance(caller ModuleInstance) ModuleInstance {
|
|
return caller.Child(c.Call.Name, c.Key)
|
|
}
|
|
|
|
// Output returns the absolute address of an output of the receiver identified by its
|
|
// name.
|
|
func (c ModuleCallInstance) Output(name string) ModuleCallInstanceOutput {
|
|
return ModuleCallInstanceOutput{
|
|
Call: c,
|
|
Name: name,
|
|
}
|
|
}
|
|
|
|
// ModuleCallOutput is the address of a named output and its associated
|
|
// ModuleCall, which may expand into multiple module instances
|
|
type ModuleCallOutput struct {
|
|
referenceable
|
|
Call ModuleCall
|
|
Name string
|
|
}
|
|
|
|
func (m ModuleCallOutput) String() string {
|
|
return fmt.Sprintf("%s.%s", m.Call.String(), m.Name)
|
|
}
|
|
|
|
func (m ModuleCallOutput) UniqueKey() UniqueKey {
|
|
return m // A ModuleCallOutput is its own UniqueKey
|
|
}
|
|
|
|
func (m ModuleCallOutput) uniqueKeySigil() {}
|
|
|
|
// ModuleCallInstanceOutput is the address of a particular named output produced by
|
|
// an instance of a module call.
|
|
type ModuleCallInstanceOutput struct {
|
|
referenceable
|
|
Call ModuleCallInstance
|
|
Name string
|
|
}
|
|
|
|
// ModuleCallOutput returns the referenceable ModuleCallOutput for this
|
|
// particular instance.
|
|
func (co ModuleCallInstanceOutput) ModuleCallOutput() ModuleCallOutput {
|
|
return ModuleCallOutput{
|
|
Call: co.Call.Call,
|
|
Name: co.Name,
|
|
}
|
|
}
|
|
|
|
func (co ModuleCallInstanceOutput) String() string {
|
|
return fmt.Sprintf("%s.%s", co.Call.String(), co.Name)
|
|
}
|
|
|
|
func (co ModuleCallInstanceOutput) UniqueKey() UniqueKey {
|
|
return co // A ModuleCallInstanceOutput is its own UniqueKey
|
|
}
|
|
|
|
func (co ModuleCallInstanceOutput) uniqueKeySigil() {}
|
|
|
|
// AbsOutputValue returns the absolute output value address that corresponds
|
|
// to the receving module call output address, once resolved in the given
|
|
// calling module.
|
|
func (co ModuleCallInstanceOutput) AbsOutputValue(caller ModuleInstance) AbsOutputValue {
|
|
moduleAddr := co.Call.ModuleInstance(caller)
|
|
return moduleAddr.OutputValue(co.Name)
|
|
}
|