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

1use crate::err::Error;
2use crate::sql;
3use crate::sql::Value;
4use serde::de::DeserializeOwned;
5use serde_content::Deserializer;
6use serde_content::Number;
7use serde_content::Serializer;
8use serde_content::Value as Content;
9use std::borrow::Cow;
10
11impl Value {
12	fn into_content(self) -> Result<Content<'static>, Error> {
13		let serializer = Serializer::new();
14		match self {
15			Value::None => Ok(Content::Option(None)),
16			Value::Null => Ok(Content::Option(None)),
17			Value::Bool(v) => Ok(Content::Bool(v)),
18			Value::Number(v) => match v {
19				sql::Number::Int(v) => Ok(Content::Number(Number::I64(v))),
20				sql::Number::Float(v) => Ok(Content::Number(Number::F64(v))),
21				sql::Number::Decimal(v) => serializer.serialize(v).map_err(Into::into),
22			},
23			Value::Strand(sql::Strand(v)) => Ok(Content::String(Cow::Owned(v))),
24			Value::Duration(sql::Duration(v)) => serializer.serialize(v).map_err(Into::into),
25			Value::Datetime(sql::Datetime(v)) => serializer.serialize(v).map_err(Into::into),
26			Value::Uuid(sql::Uuid(v)) => serializer.serialize(v).map_err(Into::into),
27			Value::Array(sql::Array(v)) => {
28				let mut vec = Vec::with_capacity(v.len());
29				for value in v {
30					vec.push(value.into_content()?);
31				}
32				Ok(Content::Seq(vec))
33			}
34			Value::Object(sql::Object(v)) => {
35				let mut vec = Vec::with_capacity(v.len());
36				for (key, value) in v {
37					let key = Content::String(Cow::Owned(key));
38					let value = value.into_content()?;
39					vec.push((key, value));
40				}
41				Ok(Content::Map(vec))
42			}
43			Value::Geometry(v) => match v {
44				sql::Geometry::Point(v) => serializer.serialize(v).map_err(Into::into),
45				sql::Geometry::Line(v) => serializer.serialize(v).map_err(Into::into),
46				sql::Geometry::Polygon(v) => serializer.serialize(v).map_err(Into::into),
47				sql::Geometry::MultiPoint(v) => serializer.serialize(v).map_err(Into::into),
48				sql::Geometry::MultiLine(v) => serializer.serialize(v).map_err(Into::into),
49				sql::Geometry::MultiPolygon(v) => serializer.serialize(v).map_err(Into::into),
50				sql::Geometry::Collection(v) => serializer.serialize(v).map_err(Into::into),
51			},
52			Value::Bytes(sql::Bytes(v)) => Ok(Content::Bytes(Cow::Owned(v))),
53			Value::Thing(v) => serializer.serialize(v).map_err(Into::into),
54			Value::Param(sql::Param(v)) => serializer.serialize(v).map_err(Into::into),
55			Value::Idiom(sql::Idiom(v)) => serializer.serialize(v).map_err(Into::into),
56			Value::Table(sql::Table(v)) => serializer.serialize(v).map_err(Into::into),
57			Value::Mock(v) => serializer.serialize(v).map_err(Into::into),
58			Value::Regex(v) => serializer.serialize(v).map_err(Into::into),
59			Value::Cast(v) => serializer.serialize(v).map_err(Into::into),
60			Value::Block(v) => serializer.serialize(v).map_err(Into::into),
61			Value::Range(v) => serializer.serialize(v).map_err(Into::into),
62			Value::Edges(v) => serializer.serialize(v).map_err(Into::into),
63			Value::Future(v) => serializer.serialize(v).map_err(Into::into),
64			Value::Constant(v) => serializer.serialize(v).map_err(Into::into),
65			Value::Function(v) => serializer.serialize(v).map_err(Into::into),
66			Value::Subquery(v) => serializer.serialize(v).map_err(Into::into),
67			Value::Expression(v) => serializer.serialize(v).map_err(Into::into),
68			Value::Query(v) => serializer.serialize(v).map_err(Into::into),
69			Value::Model(v) => serializer.serialize(v).map_err(Into::into),
70			Value::Closure(v) => serializer.serialize(v).map_err(Into::into),
71			Value::Refs(_) => Ok(Content::Seq(vec![])),
72		}
73	}
74}
75
76/// Deserializes a value `T` from `SurrealDB` [`Value`]
77pub fn from_value<T>(value: Value) -> Result<T, Error>
78where
79	T: DeserializeOwned,
80{
81	let content = value.into_content()?;
82	let deserializer = Deserializer::new(content).coerce_numbers();
83	T::deserialize(deserializer).map_err(Into::into)
84}