2016-04-19 01:31:19 +02:00
|
|
|
package hil
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/hashicorp/hil/ast"
|
|
|
|
"github.com/mitchellh/mapstructure"
|
|
|
|
)
|
|
|
|
|
|
|
|
func InterfaceToVariable(input interface{}) (ast.Variable, error) {
|
|
|
|
var stringVal string
|
|
|
|
if err := mapstructure.WeakDecode(input, &stringVal); err == nil {
|
|
|
|
return ast.Variable{
|
|
|
|
Type: ast.TypeString,
|
|
|
|
Value: stringVal,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2016-04-19 02:15:50 +02:00
|
|
|
var mapVal map[string]interface{}
|
|
|
|
if err := mapstructure.WeakDecode(input, &mapVal); err == nil {
|
|
|
|
elements := make(map[string]ast.Variable)
|
|
|
|
for i, element := range mapVal {
|
2016-04-19 01:31:19 +02:00
|
|
|
varElement, err := InterfaceToVariable(element)
|
|
|
|
if err != nil {
|
|
|
|
return ast.Variable{}, err
|
|
|
|
}
|
|
|
|
elements[i] = varElement
|
|
|
|
}
|
|
|
|
|
|
|
|
return ast.Variable{
|
2016-04-19 02:15:50 +02:00
|
|
|
Type: ast.TypeMap,
|
2016-04-19 01:31:19 +02:00
|
|
|
Value: elements,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2016-04-19 02:15:50 +02:00
|
|
|
var sliceVal []interface{}
|
|
|
|
if err := mapstructure.WeakDecode(input, &sliceVal); err == nil {
|
|
|
|
elements := make([]ast.Variable, len(sliceVal))
|
|
|
|
for i, element := range sliceVal {
|
2016-04-19 01:31:19 +02:00
|
|
|
varElement, err := InterfaceToVariable(element)
|
|
|
|
if err != nil {
|
|
|
|
return ast.Variable{}, err
|
|
|
|
}
|
|
|
|
elements[i] = varElement
|
|
|
|
}
|
|
|
|
|
|
|
|
return ast.Variable{
|
2016-04-19 02:15:50 +02:00
|
|
|
Type: ast.TypeList,
|
2016-04-19 01:31:19 +02:00
|
|
|
Value: elements,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return ast.Variable{}, fmt.Errorf("value for conversion must be a string, interface{} or map[string]interface: got %T", input)
|
|
|
|
}
|