github.com/beauknowssoftware/makehcl@v0.0.0-20200322000747-1b9bb1e1c008/internal/parse2/stringArray.go (about) 1 package parse2 2 3 import ( 4 "fmt" 5 6 "github.com/hashicorp/hcl/v2" 7 "github.com/zclconf/go-cty/cty" 8 ) 9 10 type StringArray struct { 11 Value []string 12 attribute *hcl.Attribute 13 val cty.Value 14 ctx *hcl.EvalContext 15 } 16 17 func isStringType(key cty.Value, val cty.Value) (stop bool) { 18 return val.Type() == cty.String 19 } 20 21 func (a *StringArray) fill(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) { 22 val, diag := a.attribute.Expr.Value(ctx) 23 if diag.HasErrors() { 24 return a.val, diag 25 } 26 27 t := val.Type() 28 29 if t == cty.String { 30 v := val.AsString() 31 a.Value = []string{v} 32 a.val = val 33 a.ctx = ctx 34 35 return a.val, nil 36 } 37 38 if !val.CanIterateElements() || !val.ForEachElement(isStringType) { 39 diag := hcl.Diagnostic{ 40 Summary: "invalid type", 41 Detail: fmt.Sprintf("expected iterable strings, got %v", t.FriendlyName()), 42 Severity: hcl.DiagError, 43 Subject: &a.attribute.Range, 44 Expression: a.attribute.Expr, 45 EvalContext: ctx, 46 } 47 48 return a.val, hcl.Diagnostics{&diag} 49 } 50 51 slc := val.AsValueSlice() 52 a.Value = make([]string, 0, len(slc)) 53 a.val = val 54 a.ctx = ctx 55 56 for _, i := range slc { 57 a.Value = append(a.Value, i.AsString()) 58 } 59 60 return a.val, nil 61 }