multisql/data/value/
literal.rs

1use {
2	super::{error::ValueError, Value},
3	crate::result::{Error, Result},
4	sqlparser::ast::Value as AstValue,
5	std::convert::TryFrom,
6};
7
8impl<'a> TryFrom<&'a AstValue> for Value {
9	type Error = Error;
10
11	fn try_from(ast_value: &'a AstValue) -> Result<Self> {
12		match ast_value {
13			AstValue::Boolean(value) => Ok(Value::Bool(*value)),
14			AstValue::Number(value, false) => value
15				.parse::<i64>()
16				.map_or_else(
17					|_| value.parse::<f64>().map(Value::F64),
18					|value| Ok(Value::I64(value)),
19				)
20				.map_err(|_| ValueError::FailedToParseNumber.into()),
21			AstValue::SingleQuotedString(value) => Ok(Value::Str(value.clone())),
22			AstValue::Null => Ok(Value::Null),
23			_ => Err(ValueError::UnimplementedLiteralType.into()),
24		}
25	}
26}