| 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, |
| } |
| } |
| |
| func (c ModuleCall) Equal(other ModuleCall) bool { |
| return c.Name == other.Name |
| } |
| |
| // 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 |
| } |
| |
| func (c AbsModuleCall) Equal(other AbsModuleCall) bool { |
| return c.Module.Equal(other.Module) && c.Call.Equal(other.Call) |
| } |
| |
| type absModuleCallInstanceKey string |
| |
| func (c AbsModuleCall) UniqueKey() UniqueKey { |
| return absModuleCallInstanceKey(c.String()) |
| } |
| |
| func (mk absModuleCallInstanceKey) uniqueKeySigil() {} |
| |
| // 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) |
| } |