From c97dd145b9edd2fce58eb71e665c2b1305a3ee74 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 3 May 2018 10:33:02 -0700 Subject: [PATCH] addrs: Module.Call method This is a helper for splitting a non-root module path into a callee and call pair, similar to the method of the same name on ModuleInstance. --- addrs/module.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/addrs/module.go b/addrs/module.go index 8e30f1b16..6420c6301 100644 --- a/addrs/module.go +++ b/addrs/module.go @@ -52,3 +52,24 @@ func (m Module) Parent() Module { } return m[:len(m)-1] } + +// Call returns the module call address that corresponds to the given module +// instance, along with the address of the module that contains it. +// +// There is no call for the root module, so this method will panic if called +// on the root module address. +// +// In practice, this just turns the last element of the receiver into a +// ModuleCall and then returns a slice of the receiever that excludes that +// last part. This is just a convenience for situations where a call address +// is required, such as when dealing with *Reference and Referencable values. +func (m Module) Call() (Module, ModuleCall) { + if len(m) == 0 { + panic("cannot produce ModuleCall for root module") + } + + caller, callName := m[:len(m)-1], m[len(m)-1] + return caller, ModuleCall{ + Name: callName, + } +}