in cmd/kazel/kazel.go [211:244]
func asExpr(e interface{}) build.Expr {
rv := reflect.ValueOf(e)
switch rv.Kind() {
case reflect.Bool:
return &build.LiteralExpr{Token: fmt.Sprintf("%t", e)}
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return &build.LiteralExpr{Token: fmt.Sprintf("%d", e)}
case reflect.Float32, reflect.Float64:
return &build.LiteralExpr{Token: fmt.Sprintf("%g", e)}
case reflect.String:
return &build.StringExpr{Value: e.(string)}
case reflect.Slice, reflect.Array:
var list []build.Expr
for i := 0; i < rv.Len(); i++ {
list = append(list, asExpr(rv.Index(i).Interface()))
}
return &build.ListExpr{List: list}
case reflect.Map:
var list []*build.KeyValueExpr
keys := rv.MapKeys()
sort.SliceStable(keys, rvSliceLessFunc(rv.Type().Key().Kind(), keys))
for _, key := range keys {
list = append(list, &build.KeyValueExpr{
Key: asExpr(key.Interface()),
Value: asExpr(rv.MapIndex(key).Interface()),
})
}
return &build.DictExpr{List: list}
default:
klog.Fatalf("unhandled kind: %q for value: %q", rv.Kind(), rv)
return nil
}
}