addrs: Reference.DisplayString method
We've ended up implementing something approximately like this in a few places now, so this is a centralized version that we can consolidate on moving forward, gradually removing that duplication.
This commit is contained in:
parent
979ac3da44
commit
2453025a1a
|
@ -2,10 +2,12 @@ package addrs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/hcl/v2"
|
"github.com/hashicorp/hcl/v2"
|
||||||
"github.com/hashicorp/hcl/v2/hclsyntax"
|
"github.com/hashicorp/hcl/v2/hclsyntax"
|
||||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||||
|
"github.com/zclconf/go-cty/cty"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Reference describes a reference to an address with source location
|
// Reference describes a reference to an address with source location
|
||||||
|
@ -16,6 +18,43 @@ type Reference struct {
|
||||||
Remaining hcl.Traversal
|
Remaining hcl.Traversal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DisplayString returns a string that approximates the subject and remaining
|
||||||
|
// traversal of the reciever in a way that resembles the Terraform language
|
||||||
|
// syntax that could've produced it.
|
||||||
|
//
|
||||||
|
// It's not guaranteed to actually be a valid Terraform language expression,
|
||||||
|
// since the intended use here is primarily for UI messages such as
|
||||||
|
// diagnostics.
|
||||||
|
func (r *Reference) DisplayString() string {
|
||||||
|
if len(r.Remaining) == 0 {
|
||||||
|
// Easy case: we can just return the subject's string.
|
||||||
|
return r.Subject.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
var ret strings.Builder
|
||||||
|
ret.WriteString(r.Subject.String())
|
||||||
|
for _, step := range r.Remaining {
|
||||||
|
switch tStep := step.(type) {
|
||||||
|
case hcl.TraverseRoot:
|
||||||
|
ret.WriteString(tStep.Name)
|
||||||
|
case hcl.TraverseAttr:
|
||||||
|
ret.WriteByte('.')
|
||||||
|
ret.WriteString(tStep.Name)
|
||||||
|
case hcl.TraverseIndex:
|
||||||
|
ret.WriteByte('[')
|
||||||
|
switch tStep.Key.Type() {
|
||||||
|
case cty.String:
|
||||||
|
ret.WriteString(fmt.Sprintf("%q", tStep.Key.AsString()))
|
||||||
|
case cty.Number:
|
||||||
|
bf := tStep.Key.AsBigFloat()
|
||||||
|
ret.WriteString(bf.Text('g', 10))
|
||||||
|
}
|
||||||
|
ret.WriteByte(']')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret.String()
|
||||||
|
}
|
||||||
|
|
||||||
// ParseRef attempts to extract a referencable address from the prefix of the
|
// ParseRef attempts to extract a referencable address from the prefix of the
|
||||||
// given traversal, which must be an absolute traversal or this function
|
// given traversal, which must be an absolute traversal or this function
|
||||||
// will panic.
|
// will panic.
|
||||||
|
|
Loading…
Reference in New Issue