1package query
2
3import "github.com/influxdata/influxql"
4
5// castToType will coerce the underlying interface type to another
6// interface depending on the type.
7func castToType(v interface{}, typ influxql.DataType) interface{} {
8	switch typ {
9	case influxql.Float:
10		if val, ok := castToFloat(v); ok {
11			v = val
12		}
13	case influxql.Integer:
14		if val, ok := castToInteger(v); ok {
15			v = val
16		}
17	case influxql.Unsigned:
18		if val, ok := castToUnsigned(v); ok {
19			v = val
20		}
21	case influxql.String, influxql.Tag:
22		if val, ok := castToString(v); ok {
23			v = val
24		}
25	case influxql.Boolean:
26		if val, ok := castToBoolean(v); ok {
27			v = val
28		}
29	}
30	return v
31}
32
33func castToFloat(v interface{}) (float64, bool) {
34	switch v := v.(type) {
35	case float64:
36		return v, true
37	case int64:
38		return float64(v), true
39	case uint64:
40		return float64(v), true
41	default:
42		return float64(0), false
43	}
44}
45
46func castToInteger(v interface{}) (int64, bool) {
47	switch v := v.(type) {
48	case float64:
49		return int64(v), true
50	case int64:
51		return v, true
52	case uint64:
53		return int64(v), true
54	default:
55		return int64(0), false
56	}
57}
58
59func castToUnsigned(v interface{}) (uint64, bool) {
60	switch v := v.(type) {
61	case float64:
62		return uint64(v), true
63	case uint64:
64		return v, true
65	case int64:
66		return uint64(v), true
67	default:
68		return uint64(0), false
69	}
70}
71
72func castToString(v interface{}) (string, bool) {
73	switch v := v.(type) {
74	case string:
75		return v, true
76	default:
77		return "", false
78	}
79}
80
81func castToBoolean(v interface{}) (bool, bool) {
82	switch v := v.(type) {
83	case bool:
84		return v, true
85	default:
86		return false, false
87	}
88}
89