addrs: All Referenceable implementations support String()
This gives us a convenient way to convert back to a string representation that matches what the user would've written in configuration.
This commit is contained in:
parent
f2809854a2
commit
e5dfa17433
|
@ -6,3 +6,7 @@ type CountAttr struct {
|
|||
referenceable
|
||||
Name string
|
||||
}
|
||||
|
||||
func (ca CountAttr) String() string {
|
||||
return "count." + ca.Name
|
||||
}
|
||||
|
|
|
@ -5,3 +5,7 @@ type InputVariable struct {
|
|||
referenceable
|
||||
Name string
|
||||
}
|
||||
|
||||
func (v InputVariable) String() string {
|
||||
return "var." + v.Name
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ import (
|
|||
// InstanceKey.
|
||||
type InstanceKey interface {
|
||||
instanceKeySigil()
|
||||
String() string
|
||||
}
|
||||
|
||||
// ParseInstanceKey returns the instance key corresponding to the given value,
|
||||
|
@ -51,9 +52,19 @@ type IntKey int
|
|||
func (k IntKey) instanceKeySigil() {
|
||||
}
|
||||
|
||||
func (k IntKey) String() string {
|
||||
return fmt.Sprintf("[%d]", int(k))
|
||||
}
|
||||
|
||||
// StringKey is the InstanceKey representation representing string indices, as
|
||||
// used when the "for_each" argument is specified with a map or object type.
|
||||
type StringKey string
|
||||
|
||||
func (k StringKey) instanceKeySigil() {
|
||||
}
|
||||
|
||||
func (k StringKey) String() string {
|
||||
// FIXME: This isn't _quite_ right because Go's quoted string syntax is
|
||||
// slightly different than HCL's, but we'll accept it for now.
|
||||
return fmt.Sprintf("[%q]", string(k))
|
||||
}
|
||||
|
|
|
@ -5,3 +5,7 @@ type LocalValue struct {
|
|||
referenceable
|
||||
Name string
|
||||
}
|
||||
|
||||
func (v LocalValue) String() string {
|
||||
return "local." + v.Name
|
||||
}
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package addrs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// ModuleCall is the address of a call from the current module to a child
|
||||
// module.
|
||||
//
|
||||
|
@ -10,6 +14,10 @@ type ModuleCall struct {
|
|||
Name string
|
||||
}
|
||||
|
||||
func (c ModuleCall) String() string {
|
||||
return "module." + c.Name
|
||||
}
|
||||
|
||||
// Instance returns the address of an instance of the receiver identified by
|
||||
// the given key.
|
||||
func (c ModuleCall) Instance(key InstanceKey) ModuleCallInstance {
|
||||
|
@ -28,6 +36,13 @@ type ModuleCallInstance struct {
|
|||
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)
|
||||
}
|
||||
|
||||
// Output returns the address of an output of the receiver identified by its
|
||||
// name.
|
||||
func (c ModuleCallInstance) Output(name string) ModuleCallOutput {
|
||||
|
@ -44,3 +59,7 @@ type ModuleCallOutput struct {
|
|||
Call ModuleCallInstance
|
||||
Name string
|
||||
}
|
||||
|
||||
func (co ModuleCallOutput) String() string {
|
||||
return fmt.Sprintf("%s.%s", co.Call.String(), co.Name)
|
||||
}
|
||||
|
|
|
@ -6,3 +6,7 @@ type PathAttr struct {
|
|||
referenceable
|
||||
Name string
|
||||
}
|
||||
|
||||
func (pa PathAttr) String() string {
|
||||
return "path." + pa.Name
|
||||
}
|
||||
|
|
|
@ -3,7 +3,14 @@ package addrs
|
|||
// Referenceable is an interface implemented by all address types that can
|
||||
// appear as references in configuration language expressions.
|
||||
type Referenceable interface {
|
||||
// All implementations of this interface must be covered by the type switch
|
||||
// in lang.Scope.buildEvalContext.
|
||||
referenceableSigil()
|
||||
|
||||
// String produces a string representation of the address that could be
|
||||
// parsed as a HCL traversal and passed to ParseRef to produce an identical
|
||||
// result.
|
||||
String() string
|
||||
}
|
||||
|
||||
type referenceable struct {
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package addrs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Resource is an address for a resource block within configuration, which
|
||||
// contains potentially-multiple resource instances if that configuration
|
||||
// block uses "count" or "for_each".
|
||||
|
@ -10,6 +14,17 @@ type Resource struct {
|
|||
Name string
|
||||
}
|
||||
|
||||
func (r Resource) String() string {
|
||||
switch r.Mode {
|
||||
case ManagedResourceMode:
|
||||
return fmt.Sprintf("%s.%s", r.Type, r.Name)
|
||||
case DataResourceMode:
|
||||
return fmt.Sprintf("data.%s.%s", r.Type, r.Name)
|
||||
default:
|
||||
panic(fmt.Errorf("resource address with invalid mode %s", r.Mode))
|
||||
}
|
||||
}
|
||||
|
||||
// Instance produces the address for a specific instance of the receiver
|
||||
// that is idenfied by the given key.
|
||||
func (r Resource) Instance(key InstanceKey) ResourceInstance {
|
||||
|
@ -37,6 +52,13 @@ type ResourceInstance struct {
|
|||
Key InstanceKey
|
||||
}
|
||||
|
||||
func (r ResourceInstance) String() string {
|
||||
if r.Key == NoKey {
|
||||
return r.Resource.String()
|
||||
}
|
||||
return r.Resource.String() + r.Key.String()
|
||||
}
|
||||
|
||||
// Absolute returns an AbsResourceInstance from the receiver and the given module
|
||||
// instance address.
|
||||
func (r ResourceInstance) Absolute(module ModuleInstance) AbsResourceInstance {
|
||||
|
|
|
@ -8,3 +8,7 @@ type selfT int
|
|||
|
||||
func (s selfT) referenceableSigil() {
|
||||
}
|
||||
|
||||
func (s selfT) String() string {
|
||||
return "self"
|
||||
}
|
||||
|
|
|
@ -6,3 +6,7 @@ type TerraformAttr struct {
|
|||
referenceable
|
||||
Name string
|
||||
}
|
||||
|
||||
func (ta TerraformAttr) String() string {
|
||||
return "terraform." + ta.Name
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue