diff --git a/caste.go b/caste.go index 70c7291..3234011 100644 --- a/caste.go +++ b/caste.go @@ -1247,3 +1247,73 @@ func jsonStringToObject(s string, v interface{}) error { data := []byte(s) return json.Unmarshal(data, v) } + +// StringToSpecificedInterfaceWithError casts string value to given data type +func StringToSpecificedInterfaceWithError(dataType string, value string) (interface{}, error) { + return ToSpecificedInterfaceWithError(dataType, value) +} + +// StringSliceToSpecificedInterfaceWithError casts string slice to given data type +func StringSliceToSpecificedInterfaceWithError(dataType string, value []string) (interface{}, error) { + return ToSpecificedInterfaceWithError(dataType, value) +} + +// ToSpecificedInterfaceWithError casts the interface to given data type +func ToSpecificedInterfaceWithError(dataType string, i interface{}) (interface{}, error) { + switch strings.ToLower(dataType) { + case "bool": + return ToBoolE(i) + case "boolslice", "bool_slice", "[]bool": + return ToBoolSliceE(i) + case "duration": + return ToDurationE(i) + case "durationslice", "duration_slice", "[]duration": + return ToDurationSliceE(i) + case "float32": + return ToFloat32E(i) + case "float64": + return ToFloat64E(i) + case "int": + return ToIntE(i) + case "int8": + return ToInt8E(i) + case "int16": + return ToInt16E(i) + case "int32": + return ToInt32E(i) + case "int64": + return ToInt64E(i) + case "intslice", "int_slice", "[]int": + return ToIntSliceE(i) + case "slice": + return ToSliceE(i) + case "string": + return ToStringE(i) + case "stringmap", "string_map", "map[string]interface{}": + return ToStringMapE(i) + case "stringmapbool", "string_map_bool", "map[string]bool": + return ToStringMapBoolE(i) + case "stringmapint", "string_map_int", "map[string]int": + return ToStringMapIntE(i) + case "stringmapint64", "string_map_int64", "map[string]int64": + return ToStringMapInt64E(i) + case "stringmapstring", "string_map_string", "map[string]string": + return ToStringMapStringE(i) + case "stringmapstringslice", "string_map_string_slice", "map[string][]string": + return ToStringMapStringSliceE(i) + case "stringslice", "string_slice", "[]string": + return ToStringSliceE(i) + case "time": + return ToTimeE(i) + case "uint": + return ToUintE(i) + case "uint8": + return ToUint8E(i) + case "uint16": + return ToUint16E(i) + case "uint32": + return ToUint32E(i) + default: + return nil, fmt.Errorf("unable to cast %#v to %v", i, dataType) + } +}