github.com/sfdevops1/terrra4orm@v0.11.12-beta1/configs/config.go (about) 1 package configs 2 3 import ( 4 version "github.com/hashicorp/go-version" 5 "github.com/hashicorp/hcl2/hcl" 6 ) 7 8 // A Config is a node in the tree of modules within a configuration. 9 // 10 // The module tree is constructed by following ModuleCall instances recursively 11 // through the root module transitively into descendent modules. 12 // 13 // A module tree described in *this* package represents the static tree 14 // represented by configuration. During evaluation a static ModuleNode may 15 // expand into zero or more module instances depending on the use of count and 16 // for_each configuration attributes within each call. 17 type Config struct { 18 // RootModule points to the Config for the root module within the same 19 // module tree as this module. If this module _is_ the root module then 20 // this is self-referential. 21 Root *Config 22 23 // ParentModule points to the Config for the module that directly calls 24 // this module. If this is the root module then this field is nil. 25 Parent *Config 26 27 // Path is a sequence of module logical names that traverse from the root 28 // module to this config. Path is empty for the root module. 29 // 30 // This should not be used to display a path to the end-user, since 31 // our UI conventions call for us to return a module address string in that 32 // case, and a module address string ought to be built from the dynamic 33 // module tree (resulting from evaluating "count" and "for_each" arguments 34 // on our calls to produce potentially multiple child instances per call) 35 // rather than from our static module tree. 36 Path []string 37 38 // ChildModules points to the Config for each of the direct child modules 39 // called from this module. The keys in this map match the keys in 40 // Module.ModuleCalls. 41 Children map[string]*Config 42 43 // Module points to the object describing the configuration for the 44 // various elements (variables, resources, etc) defined by this module. 45 Module *Module 46 47 // CallRange is the source range for the header of the module block that 48 // requested this module. 49 // 50 // This field is meaningless for the root module, where its contents are undefined. 51 CallRange hcl.Range 52 53 // SourceAddr is the source address that the referenced module was requested 54 // from, as specified in configuration. 55 // 56 // This field is meaningless for the root module, where its contents are undefined. 57 SourceAddr string 58 59 // SourceAddrRange is the location in the configuration source where the 60 // SourceAddr value was set, for use in diagnostic messages. 61 // 62 // This field is meaningless for the root module, where its contents are undefined. 63 SourceAddrRange hcl.Range 64 65 // Version is the specific version that was selected for this module, 66 // based on version constraints given in configuration. 67 // 68 // This field is nil if the module was loaded from a non-registry source, 69 // since versions are not supported for other sources. 70 // 71 // This field is meaningless for the root module, where it will always 72 // be nil. 73 Version *version.Version 74 } 75 76 // Depth returns the number of "hops" the receiver is from the root of its 77 // module tree, with the root module having a depth of zero. 78 func (c *Config) Depth() int { 79 ret := 0 80 this := c 81 for this.Parent != nil { 82 ret++ 83 this = this.Parent 84 } 85 return ret 86 } 87 88 // DeepEach calls the given function once for each module in the tree, starting 89 // with the receiver. 90 // 91 // A parent is always called before its children and children of a particular 92 // node are visited in lexicographic order by their names. 93 func (c *Config) DeepEach(cb func(c *Config)) { 94 cb(c) 95 96 names := make([]string, 0, len(c.Children)) 97 for name := range c.Children { 98 names = append(names, name) 99 } 100 101 for _, name := range names { 102 c.Children[name].DeepEach(cb) 103 } 104 } 105 106 // AllModules returns a slice of all the receiver and all of its descendent 107 // nodes in the module tree, in the same order they would be visited by 108 // DeepEach. 109 func (c *Config) AllModules() []*Config { 110 var ret []*Config 111 c.DeepEach(func(c *Config) { 112 ret = append(ret, c) 113 }) 114 return ret 115 }