github.com/rstandt/terraform@v0.12.32-0.20230710220336-b1063613405c/addrs/module.go (about) 1 package addrs 2 3 import ( 4 "strings" 5 ) 6 7 // Module is an address for a module call within configuration. This is 8 // the static counterpart of ModuleInstance, representing a traversal through 9 // the static module call tree in configuration and does not take into account 10 // the potentially-multiple instances of a module that might be created by 11 // "count" and "for_each" arguments within those calls. 12 // 13 // This type should be used only in very specialized cases when working with 14 // the static module call tree. Type ModuleInstance is appropriate in more cases. 15 // 16 // Although Module is a slice, it should be treated as immutable after creation. 17 type Module []string 18 19 // RootModule is the module address representing the root of the static module 20 // call tree, which is also the zero value of Module. 21 // 22 // Note that this is not the root of the dynamic module tree, which is instead 23 // represented by RootModuleInstance. 24 var RootModule Module 25 26 // IsRoot returns true if the receiver is the address of the root module, 27 // or false otherwise. 28 func (m Module) IsRoot() bool { 29 return len(m) == 0 30 } 31 32 func (m Module) String() string { 33 if len(m) == 0 { 34 return "" 35 } 36 return strings.Join([]string(m), ".") 37 } 38 39 // Child returns the address of a child call in the receiver, identified by the 40 // given name. 41 func (m Module) Child(name string) Module { 42 ret := make(Module, 0, len(m)+1) 43 ret = append(ret, m...) 44 return append(ret, name) 45 } 46 47 // Parent returns the address of the parent module of the receiver, or the 48 // receiver itself if there is no parent (if it's the root module address). 49 func (m Module) Parent() Module { 50 if len(m) == 0 { 51 return m 52 } 53 return m[:len(m)-1] 54 } 55 56 // Call returns the module call address that corresponds to the given module 57 // instance, along with the address of the module that contains it. 58 // 59 // There is no call for the root module, so this method will panic if called 60 // on the root module address. 61 // 62 // In practice, this just turns the last element of the receiver into a 63 // ModuleCall and then returns a slice of the receiever that excludes that 64 // last part. This is just a convenience for situations where a call address 65 // is required, such as when dealing with *Reference and Referencable values. 66 func (m Module) Call() (Module, ModuleCall) { 67 if len(m) == 0 { 68 panic("cannot produce ModuleCall for root module") 69 } 70 71 caller, callName := m[:len(m)-1], m[len(m)-1] 72 return caller, ModuleCall{ 73 Name: callName, 74 } 75 }