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  }