mirror of https://github.com/hashicorp/consul
53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
|
package resourcehcl
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
|
||
|
"github.com/zclconf/go-cty/cty"
|
||
|
"github.com/zclconf/go-cty/cty/function"
|
||
|
|
||
|
"github.com/hashicorp/consul/internal/protohcl"
|
||
|
"github.com/hashicorp/consul/internal/resource"
|
||
|
"github.com/hashicorp/consul/proto-public/pbresource"
|
||
|
)
|
||
|
|
||
|
// Unmarshal the given HCL source into a resource.
|
||
|
func Unmarshal(src []byte, reg resource.Registry) (*pbresource.Resource, error) {
|
||
|
return UnmarshalOptions{}.Unmarshal(src, reg)
|
||
|
}
|
||
|
|
||
|
type UnmarshalOptions struct{ SourceFileName string }
|
||
|
|
||
|
// Unmarshal the given HCL source into a resource.
|
||
|
func (u UnmarshalOptions) Unmarshal(src []byte, reg resource.Registry) (*pbresource.Resource, error) {
|
||
|
var out pbresource.Resource
|
||
|
err := (protohcl.UnmarshalOptions{
|
||
|
SourceFileName: u.SourceFileName,
|
||
|
AnyTypeProvider: anyProvider{
|
||
|
base: &protohcl.AnyTypeURLProvider{TypeURLFieldName: "Type"},
|
||
|
reg: reg,
|
||
|
},
|
||
|
FieldNamer: fieldNamer{acroynms: []string{"ID", "TCP", "UDP", "HTTP"}},
|
||
|
Functions: map[string]function.Function{"gvk": gvk},
|
||
|
}).Unmarshal(src, &out)
|
||
|
return &out, err
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
typeType = cty.Capsule("type", reflect.TypeOf(pbresource.Type{}))
|
||
|
|
||
|
gvk = function.New(&function.Spec{
|
||
|
Params: []function.Parameter{
|
||
|
{Name: "GVK String", Type: cty.String},
|
||
|
},
|
||
|
Type: function.StaticReturnType(typeType),
|
||
|
Impl: func(args []cty.Value, _ cty.Type) (cty.Value, error) {
|
||
|
t, err := resource.ParseGVK(args[0].AsString())
|
||
|
if err != nil {
|
||
|
return cty.NilVal, err
|
||
|
}
|
||
|
return cty.CapsuleVal(typeType, t), nil
|
||
|
},
|
||
|
})
|
||
|
)
|