func asExpr()

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
	}
}