surrealdb_core/sql/value/serde/de/
mod.rs

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use crate::err::Error;
use crate::sql;
use crate::sql::Value;
use serde::de::DeserializeOwned;
use serde_content::Deserializer;
use serde_content::Number;
use serde_content::Serializer;
use serde_content::Value as Content;
use std::borrow::Cow;

impl Value {
	fn into_content(self) -> Result<Content<'static>, Error> {
		let serializer = Serializer::new();
		match self {
			Value::None => Ok(Content::Option(None)),
			Value::Null => Ok(Content::Option(None)),
			Value::Bool(v) => Ok(Content::Bool(v)),
			Value::Number(v) => match v {
				sql::Number::Int(v) => Ok(Content::Number(Number::I64(v))),
				sql::Number::Float(v) => Ok(Content::Number(Number::F64(v))),
				sql::Number::Decimal(v) => serializer.serialize(v).map_err(Into::into),
			},
			Value::Strand(sql::Strand(v)) => Ok(Content::String(Cow::Owned(v))),
			Value::Duration(sql::Duration(v)) => serializer.serialize(v).map_err(Into::into),
			Value::Datetime(sql::Datetime(v)) => serializer.serialize(v).map_err(Into::into),
			Value::Uuid(sql::Uuid(v)) => serializer.serialize(v).map_err(Into::into),
			Value::Array(sql::Array(v)) => {
				let mut vec = Vec::with_capacity(v.len());
				for value in v {
					vec.push(value.into_content()?);
				}
				Ok(Content::Seq(vec))
			}
			Value::Object(sql::Object(v)) => {
				let mut vec = Vec::with_capacity(v.len());
				for (key, value) in v {
					let key = Content::String(Cow::Owned(key));
					let value = value.into_content()?;
					vec.push((key, value));
				}
				Ok(Content::Map(vec))
			}
			Value::Geometry(v) => match v {
				sql::Geometry::Point(v) => serializer.serialize(v).map_err(Into::into),
				sql::Geometry::Line(v) => serializer.serialize(v).map_err(Into::into),
				sql::Geometry::Polygon(v) => serializer.serialize(v).map_err(Into::into),
				sql::Geometry::MultiPoint(v) => serializer.serialize(v).map_err(Into::into),
				sql::Geometry::MultiLine(v) => serializer.serialize(v).map_err(Into::into),
				sql::Geometry::MultiPolygon(v) => serializer.serialize(v).map_err(Into::into),
				sql::Geometry::Collection(v) => serializer.serialize(v).map_err(Into::into),
			},
			Value::Bytes(sql::Bytes(v)) => Ok(Content::Bytes(Cow::Owned(v))),
			Value::Thing(v) => serializer.serialize(v).map_err(Into::into),
			Value::Param(sql::Param(v)) => serializer.serialize(v).map_err(Into::into),
			Value::Idiom(sql::Idiom(v)) => serializer.serialize(v).map_err(Into::into),
			Value::Table(sql::Table(v)) => serializer.serialize(v).map_err(Into::into),
			Value::Mock(v) => serializer.serialize(v).map_err(Into::into),
			Value::Regex(v) => serializer.serialize(v).map_err(Into::into),
			Value::Cast(v) => serializer.serialize(v).map_err(Into::into),
			Value::Block(v) => serializer.serialize(v).map_err(Into::into),
			Value::Range(v) => serializer.serialize(v).map_err(Into::into),
			Value::Edges(v) => serializer.serialize(v).map_err(Into::into),
			Value::Future(v) => serializer.serialize(v).map_err(Into::into),
			Value::Constant(v) => serializer.serialize(v).map_err(Into::into),
			Value::Function(v) => serializer.serialize(v).map_err(Into::into),
			Value::Subquery(v) => serializer.serialize(v).map_err(Into::into),
			Value::Expression(v) => serializer.serialize(v).map_err(Into::into),
			Value::Query(v) => serializer.serialize(v).map_err(Into::into),
			Value::Model(v) => serializer.serialize(v).map_err(Into::into),
			Value::Closure(v) => serializer.serialize(v).map_err(Into::into),
			Value::Refs(_) => Ok(Content::Seq(vec![])),
		}
	}
}

/// Deserializes a value `T` from `SurrealDB` [`Value`]
pub fn from_value<T>(value: Value) -> Result<T, Error>
where
	T: DeserializeOwned,
{
	let content = value.into_content()?;
	let deserializer = Deserializer::new(content).coerce_numbers();
	T::deserialize(deserializer).map_err(Into::into)
}