1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use {
	crate::{Cast, Result, Value, ValueError, ValueType},
	std::string::ToString,
};

impl Value {
	pub fn cast_valuetype(&self, value_type: &ValueType) -> Result<Self> {
		match (value_type, self) {
			(ValueType::Bool, Value::Bool(_))
			| (ValueType::I64, Value::I64(_))
			| (ValueType::F64, Value::F64(_))
			| (ValueType::Str, Value::Str(_))
			| (ValueType::Any, _) => Ok(self.clone()),
			(_, Value::Null) => Ok(Value::Null),

			(ValueType::Bool, value) => value.clone().cast().map(Value::Bool),
			(ValueType::I64, value) => value.clone().cast().map(Value::I64),
			(ValueType::F64, value) => value.clone().cast().map(Value::F64),
			(ValueType::Str, value) => value.clone().cast().map(Value::Str),

			_ => Err(ValueError::UnimplementedCast.into()),
		}
	}
}

impl ToString for ValueType {
	fn to_string(&self) -> String {
		use ValueType::*;
		match self {
			Bool => String::from("Bool"),
			U64 => String::from("UInt"),
			I64 => String::from("Int"),
			F64 => String::from("Float"),
			Str => String::from("Text"),
			Timestamp => String::from("Timestamp"),
			Any => String::from("Any"),
		}
	}
}