zcldec: convert AttrSpec results to the given type
This commit is contained in:
parent
446387109d
commit
cd85a1f0a6
@ -56,6 +56,26 @@ func TestDecode(t *testing.T) {
|
|||||||
cty.NumberIntVal(1),
|
cty.NumberIntVal(1),
|
||||||
0,
|
0,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
`a = "1"`,
|
||||||
|
&AttrSpec{
|
||||||
|
Name: "a",
|
||||||
|
Type: cty.Number,
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
cty.NumberIntVal(1),
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
`a = true`,
|
||||||
|
&AttrSpec{
|
||||||
|
Name: "a",
|
||||||
|
Type: cty.Number,
|
||||||
|
},
|
||||||
|
nil,
|
||||||
|
cty.UnknownVal(cty.Number),
|
||||||
|
1, // incorrect type - number required.
|
||||||
|
},
|
||||||
{
|
{
|
||||||
``,
|
``,
|
||||||
&AttrSpec{
|
&AttrSpec{
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/zclconf/go-cty/cty"
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
"github.com/zclconf/go-cty/cty/convert"
|
||||||
"github.com/zclconf/go-zcl/zcl"
|
"github.com/zclconf/go-zcl/zcl"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -168,8 +169,28 @@ func (s *AttrSpec) decode(content *zcl.BodyContent, block *zcl.Block, ctx *zcl.E
|
|||||||
return cty.NullVal(s.Type), nil
|
return cty.NullVal(s.Type), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Also try to convert the result value to s.Type
|
val, diags := attr.Expr.Value(ctx)
|
||||||
return attr.Expr.Value(ctx)
|
|
||||||
|
convVal, err := convert.Convert(val, s.Type)
|
||||||
|
if err != nil {
|
||||||
|
diags = append(diags, &zcl.Diagnostic{
|
||||||
|
Severity: zcl.DiagError,
|
||||||
|
Summary: "Incorrect attribute value type",
|
||||||
|
Detail: fmt.Sprintf(
|
||||||
|
"Inappropriate value for attribute %q: %s.",
|
||||||
|
s.Name, err.Error(),
|
||||||
|
),
|
||||||
|
Subject: attr.Expr.StartRange().Ptr(),
|
||||||
|
Context: zcl.RangeBetween(attr.NameRange, attr.Expr.StartRange()).Ptr(),
|
||||||
|
})
|
||||||
|
// We'll return an unknown value of the _correct_ type so that the
|
||||||
|
// incomplete result can still be used for some analysis use-cases.
|
||||||
|
val = cty.UnknownVal(s.Type)
|
||||||
|
} else {
|
||||||
|
val = convVal
|
||||||
|
}
|
||||||
|
|
||||||
|
return val, diags
|
||||||
}
|
}
|
||||||
|
|
||||||
// A LiteralSpec is a Spec that produces the given literal value, ignoring
|
// A LiteralSpec is a Spec that produces the given literal value, ignoring
|
||||||
|
Loading…
x
Reference in New Issue
Block a user