surrealdb_core/sql/value/serde/de/
mod.rs1use 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
76pub 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}