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

1mod r#enum;
2mod r#struct;
3
4use crate::err::Error;
5use crate::sql;
6use crate::sql::value::Value;
7use crate::sql::Bytes;
8use castaway::match_type;
9use serde::ser::Serialize;
10use serde_content::Number;
11use serde_content::Serializer;
12use serde_content::Unexpected;
13use std::borrow::Cow;
14use std::collections::BTreeMap;
15use std::fmt::Display;
16
17type Content = serde_content::Value<'static>;
18
19/// Convert a `T` into `surrealdb::sql::Value` which is an enum that can represent any valid SQL data.
20pub fn to_value<T>(value: T) -> Result<Value, Error>
21where
22	T: Serialize + 'static,
23{
24	match_type!(value, {
25		Value as v => Ok(v),
26		sql::Number as v => Ok(v.into()),
27		rust_decimal::Decimal as v => Ok(v.into()),
28		sql::Strand as v => Ok(v.into()),
29		sql::Duration as v => Ok(v.into()),
30		core::time::Duration as v => Ok(v.into()),
31		sql::Datetime as v => Ok(v.into()),
32		chrono::DateTime<chrono::Utc> as v => Ok(v.into()),
33		sql::Uuid as v => Ok(v.into()),
34		uuid::Uuid as v => Ok(v.into()),
35		sql::Array as v => Ok(v.into()),
36		sql::Object as v => Ok(v.into()),
37		sql::Geometry as v => Ok(v.into()),
38		geo_types::Point as v => Ok(v.into()),
39		geo_types::LineString as v => Ok(Value::Geometry(v.into())),
40		geo_types::Polygon as v => Ok(Value::Geometry(v.into())),
41		geo_types::MultiPoint as v => Ok(Value::Geometry(v.into())),
42		geo_types::MultiLineString as v => Ok(Value::Geometry(v.into())),
43		geo_types::MultiPolygon as v => Ok(Value::Geometry(v.into())),
44		geo_types::Point as v => Ok(Value::Geometry(v.into())),
45		sql::Bytes as v => Ok(v.into()),
46		sql::Thing as v => Ok(v.into()),
47		sql::Param as v => Ok(v.into()),
48		sql::Idiom as v => Ok(v.into()),
49		sql::Table as v => Ok(v.into()),
50		sql::Mock as v => Ok(v.into()),
51		sql::Regex as v => Ok(v.into()),
52		sql::Cast as v => Ok(v.into()),
53		sql::Block as v => Ok(v.into()),
54		sql::Range as v => Ok(v.into()),
55		sql::Edges as v => Ok(v.into()),
56		sql::Future as v => Ok(v.into()),
57		sql::Constant as v => Ok(v.into()),
58		sql::Function as v => Ok(v.into()),
59		sql::Subquery as v => Ok(v.into()),
60		sql::Expression as v => Ok(v.into()),
61		sql::Query as v => Ok(v.into()),
62		sql::Model as v => Ok(v.into()),
63		sql::Closure as v => Ok(v.into()),
64		value => Serializer::new().serialize(value)?.try_into(),
65	})
66}
67
68impl TryFrom<Content> for Value {
69	type Error = Error;
70
71	fn try_from(content: Content) -> Result<Self, Self::Error> {
72		match content {
73			Content::Unit => Ok(Value::None),
74			Content::Bool(v) => Ok(v.into()),
75			Content::Number(v) => match v {
76				Number::I8(v) => Ok(v.into()),
77				Number::U8(v) => Ok(v.into()),
78				Number::I16(v) => Ok(v.into()),
79				Number::U16(v) => Ok(v.into()),
80				Number::I32(v) => Ok(v.into()),
81				Number::U32(v) => Ok(v.into()),
82				Number::F32(v) => Ok(v.into()),
83				Number::I64(v) => Ok(v.into()),
84				Number::U64(v) => Ok(v.into()),
85				Number::F64(v) => Ok(v.into()),
86				Number::I128(v) => Ok(v.into()),
87				Number::U128(v) => Ok(v.into()),
88				_ => Err(Error::Serialization("unsupported number".to_owned())),
89			},
90			Content::Char(v) => Ok(v.to_string().into()),
91			Content::String(v) => match v {
92				Cow::Borrowed(v) => Ok(v.into()),
93				Cow::Owned(v) => Ok(v.into()),
94			},
95			Content::Bytes(v) => match v {
96				Cow::Borrowed(v) => Ok(Value::Bytes(Bytes(v.to_vec()))),
97				Cow::Owned(v) => Ok(Value::Bytes(Bytes(v))),
98			},
99			Content::Seq(v) => v.try_into(),
100			Content::Map(v) => v.try_into(),
101			Content::Option(v) => match v {
102				Some(v) => (*v).try_into(),
103				None => Ok(Value::None),
104			},
105			Content::Struct(_) => r#struct::to_value(content),
106			Content::Enum(_) => r#enum::to_value(content),
107			Content::Tuple(v) => v.try_into(),
108		}
109	}
110}
111
112impl TryFrom<Vec<Content>> for Value {
113	type Error = Error;
114
115	fn try_from(v: Vec<Content>) -> Result<Self, Self::Error> {
116		let mut vec = Vec::with_capacity(v.len());
117		for content in v {
118			vec.push(content.try_into()?);
119		}
120		Ok(Self::Array(sql::Array(vec)))
121	}
122}
123
124impl TryFrom<Vec<(Content, Content)>> for Value {
125	type Error = Error;
126
127	fn try_from(v: Vec<(Content, Content)>) -> Result<Self, Self::Error> {
128		let mut map = BTreeMap::new();
129		for (key, value) in v {
130			let key = match key {
131				Content::String(v) => match v {
132					Cow::Borrowed(v) => v.to_owned(),
133					Cow::Owned(v) => v,
134				},
135				content => {
136					return Err(content.unexpected(serde_content::Expected::String))?;
137				}
138			};
139			let value = value.try_into()?;
140			map.insert(key, value);
141		}
142		Ok(Self::Object(sql::Object(map)))
143	}
144}
145
146impl TryFrom<Vec<(Cow<'static, str>, Content)>> for Value {
147	type Error = Error;
148
149	fn try_from(v: Vec<(Cow<'static, str>, Content)>) -> Result<Self, Self::Error> {
150		let mut map = BTreeMap::new();
151		for (key, value) in v {
152			map.insert(key.into_owned(), value.try_into()?);
153		}
154		Ok(Self::Object(sql::Object(map)))
155	}
156}
157
158impl TryFrom<(Cow<'static, str>, Content)> for Value {
159	type Error = Error;
160
161	fn try_from((key, value): (Cow<'static, str>, Content)) -> Result<Self, Self::Error> {
162		let mut map = BTreeMap::new();
163		map.insert(key.into_owned(), value.try_into()?);
164		Ok(Self::Object(sql::Object(map)))
165	}
166}
167
168impl serde::ser::Error for Error {
169	fn custom<T>(msg: T) -> Self
170	where
171		T: Display,
172	{
173		Self::Serialization(msg.to_string())
174	}
175}
176
177impl From<serde_content::Error> for Error {
178	fn from(error: serde_content::Error) -> Self {
179		Self::Serialization(error.to_string())
180	}
181}
182
183#[cfg(test)]
184mod tests {
185	use super::*;
186	use crate::sql;
187	use crate::sql::block::Entry;
188	use crate::sql::statements::CreateStatement;
189	use crate::sql::Number;
190	use crate::sql::*;
191	use ::serde::Serialize;
192	use graph::{GraphSubject, GraphSubjects};
193	use std::ops::Bound;
194
195	#[test]
196	fn value_none() {
197		let expected = Value::None;
198		assert_eq!(expected, to_value(None::<u32>).unwrap());
199		assert_eq!(expected.clone(), to_value(expected).unwrap());
200	}
201
202	#[test]
203	fn null() {
204		let expected = Value::Null;
205		assert_eq!(expected.clone(), to_value(expected).unwrap());
206	}
207
208	#[test]
209	fn r#false() {
210		let expected = Value::Bool(false);
211		assert_eq!(expected, to_value(false).unwrap());
212		assert_eq!(expected.clone(), to_value(expected).unwrap());
213	}
214
215	#[test]
216	fn r#true() {
217		let expected = Value::Bool(true);
218		assert_eq!(expected, to_value(true).unwrap());
219		assert_eq!(expected.clone(), to_value(expected).unwrap());
220	}
221
222	#[test]
223	fn number() {
224		let number = Number::Int(Default::default());
225		let value = to_value(number).unwrap();
226		let expected = Value::Number(number);
227		assert_eq!(value, expected);
228		assert_eq!(expected.clone(), to_value(expected).unwrap());
229
230		let number = Number::Float(Default::default());
231		let value = to_value(number).unwrap();
232		let expected = Value::Number(number);
233		assert_eq!(value, expected);
234		assert_eq!(expected.clone(), to_value(expected).unwrap());
235
236		let number = Number::Decimal(Default::default());
237		let value = to_value(number).unwrap();
238		let expected = Value::Number(number);
239		assert_eq!(value, expected);
240		assert_eq!(expected.clone(), to_value(expected).unwrap());
241	}
242
243	#[test]
244	fn strand() {
245		let strand = Strand("foobar".to_owned());
246		let value = to_value(strand.clone()).unwrap();
247		let expected = Value::Strand(strand);
248		assert_eq!(value, expected);
249		assert_eq!(expected.clone(), to_value(expected).unwrap());
250
251		let strand = "foobar".to_owned();
252		let value = to_value(strand.clone()).unwrap();
253		let expected = Value::Strand(strand.into());
254		assert_eq!(value, expected);
255		assert_eq!(expected.clone(), to_value(expected).unwrap());
256
257		let strand = "foobar";
258		let value = to_value(strand).unwrap();
259		let expected = Value::Strand(strand.into());
260		assert_eq!(value, expected);
261		assert_eq!(expected.clone(), to_value(expected).unwrap());
262	}
263
264	#[test]
265	fn duration() {
266		let duration = Duration::default();
267		let value = to_value(duration).unwrap();
268		let expected = Value::Duration(duration);
269		assert_eq!(value, expected);
270		assert_eq!(expected.clone(), to_value(expected).unwrap());
271	}
272
273	#[test]
274	fn datetime() {
275		let datetime = Datetime::default();
276		let value = to_value(datetime.clone()).unwrap();
277		let expected = Value::Datetime(datetime);
278		assert_eq!(value, expected);
279		assert_eq!(expected.clone(), to_value(expected).unwrap());
280	}
281
282	#[test]
283	fn uuid() {
284		let uuid = Uuid::default();
285		let value = to_value(uuid).unwrap();
286		let expected = Value::Uuid(uuid);
287		assert_eq!(value, expected);
288		assert_eq!(expected.clone(), to_value(expected).unwrap());
289	}
290
291	#[test]
292	fn array() {
293		let array = Array::default();
294		let value = to_value(array.clone()).unwrap();
295		let expected = Value::Array(array);
296		assert_eq!(value, expected);
297		assert_eq!(expected.clone(), to_value(expected).unwrap());
298	}
299
300	#[test]
301	fn object() {
302		let object = Object::default();
303		let value = to_value(object.clone()).unwrap();
304		let expected = Value::Object(object);
305		assert_eq!(value, expected);
306		assert_eq!(expected.clone(), to_value(expected).unwrap());
307	}
308
309	#[test]
310	fn geometry() {
311		let geometry = Geometry::Collection(Vec::new());
312		let value = to_value(geometry.clone()).unwrap();
313		let expected = Value::Geometry(geometry);
314		assert_eq!(value, expected);
315		assert_eq!(expected.clone(), to_value(expected).unwrap());
316	}
317
318	#[test]
319	fn bytes() {
320		let bytes = Bytes("foobar".as_bytes().to_owned());
321		let value = to_value(bytes.clone()).unwrap();
322		let expected = Value::Bytes(bytes);
323		assert_eq!(value, expected);
324		assert_eq!(expected.clone(), to_value(expected).unwrap());
325	}
326
327	#[test]
328	fn param() {
329		let param = Param::default();
330		let value = to_value(param.clone()).unwrap();
331		let expected = Value::Param(param);
332		assert_eq!(value, expected);
333		assert_eq!(expected.clone(), to_value(expected).unwrap());
334	}
335
336	#[test]
337	fn idiom() {
338		let idiom = Idiom::default();
339		let value = to_value(idiom.clone()).unwrap();
340		let expected = Value::Idiom(idiom);
341		assert_eq!(value, expected);
342		assert_eq!(expected.clone(), to_value(expected).unwrap());
343	}
344
345	#[test]
346	fn table() {
347		let table = Table("foo".to_owned());
348		let value = to_value(table.clone()).unwrap();
349		let expected = Value::Table(table);
350		assert_eq!(value, expected);
351		assert_eq!(expected.clone(), to_value(expected).unwrap());
352	}
353
354	#[test]
355	fn thing() {
356		let record_id = sql::thing("foo:bar").unwrap();
357		let value = to_value(record_id.clone()).unwrap();
358		let expected = Value::Thing(record_id);
359		assert_eq!(value, expected);
360		assert_eq!(expected.clone(), to_value(expected).unwrap());
361	}
362
363	#[test]
364	fn model() {
365		let model = Mock::Count("foo".to_owned(), Default::default());
366		let value = to_value(model.clone()).unwrap();
367		let expected = Value::Mock(model);
368		assert_eq!(value, expected);
369		assert_eq!(expected.clone(), to_value(expected).unwrap());
370	}
371
372	#[test]
373	fn regex() {
374		let regex = "abc".parse::<Regex>().unwrap();
375		let value = to_value(regex.clone()).unwrap();
376		let expected = Value::Regex(regex);
377		assert_eq!(value, expected);
378		assert_eq!(expected.clone(), to_value(expected).unwrap());
379	}
380
381	#[test]
382	fn block() {
383		let block: Box<Block> = Default::default();
384		let value = to_value(block.clone()).unwrap();
385		let expected = Value::Block(block);
386		assert_eq!(value, expected);
387		assert_eq!(expected.clone(), to_value(expected).unwrap());
388	}
389
390	#[test]
391	fn range() {
392		let range = Box::new(Range {
393			beg: Bound::Included("foo".into()),
394			end: Bound::Unbounded,
395		});
396		let value = to_value(range.clone()).unwrap();
397		let expected = Value::Range(range);
398		assert_eq!(value, expected);
399		assert_eq!(expected.clone(), to_value(expected).unwrap());
400	}
401
402	#[test]
403	fn edges() {
404		let edges = Box::new(Edges {
405			dir: Dir::In,
406			from: sql::thing("foo:bar").unwrap(),
407			what: GraphSubjects(vec![GraphSubject::Table(Table("foo".into()))]),
408		});
409		let value = to_value(edges.clone()).unwrap();
410		let expected = Value::Edges(edges);
411		assert_eq!(value, expected);
412		assert_eq!(expected.clone(), to_value(expected).unwrap());
413	}
414
415	#[test]
416	fn future() {
417		let future = Box::new(Future(Value::default().into()));
418		let value = to_value(future.clone()).unwrap();
419		let expected = Value::Future(future);
420		assert_eq!(value, expected);
421		assert_eq!(expected.clone(), to_value(expected).unwrap());
422
423		let future = Box::new(Future(Block(vec![Entry::Create(CreateStatement::default())])));
424		let value = to_value(future.clone()).unwrap();
425		let expected = Value::Future(future);
426		assert_eq!(value, expected);
427		assert_eq!(expected.clone(), to_value(expected).unwrap());
428	}
429
430	#[test]
431	fn constant() {
432		let constant = Constant::MathPi;
433		let value = to_value(constant.clone()).unwrap();
434		let expected = Value::Constant(constant);
435		assert_eq!(value, expected);
436		assert_eq!(expected.clone(), to_value(expected).unwrap());
437	}
438
439	#[test]
440	fn function() {
441		let function = Box::new(Function::Normal(Default::default(), Default::default()));
442		let value = to_value(function.clone()).unwrap();
443		let expected = Value::Function(function);
444		assert_eq!(value, expected);
445		assert_eq!(expected.clone(), to_value(expected).unwrap());
446	}
447
448	#[test]
449	fn query() {
450		let query = sql::parse("SELECT * FROM foo").unwrap();
451		let value = to_value(query.clone()).unwrap();
452		let expected = Value::Query(query);
453		assert_eq!(value, expected);
454		assert_eq!(expected.clone(), to_value(expected).unwrap());
455	}
456
457	#[test]
458	fn subquery() {
459		let subquery = Box::new(Subquery::Value(Value::None));
460		let value = to_value(subquery.clone()).unwrap();
461		let expected = Value::Subquery(subquery);
462		assert_eq!(value, expected);
463		assert_eq!(expected.clone(), to_value(expected).unwrap());
464	}
465
466	#[test]
467	fn expression() {
468		let expression = Box::new(Expression::Binary {
469			l: "foo".into(),
470			o: Operator::Equal,
471			r: "Bar".into(),
472		});
473		let value = to_value(expression.clone()).unwrap();
474		let expected = Value::Expression(expression);
475		assert_eq!(value, expected);
476		assert_eq!(expected.clone(), to_value(expected).unwrap());
477	}
478
479	#[test]
480	fn unknown_struct() {
481		#[derive(Debug, Serialize)]
482		struct FooBar {
483			foo: String,
484			bar: i32,
485		}
486
487		let foo = "Foo";
488		let bar = Default::default();
489		let foo_bar = FooBar {
490			bar,
491			foo: foo.to_owned(),
492		};
493		let value = to_value(foo_bar).unwrap();
494		let expected = Value::Object(
495			map! {
496				"foo".to_owned() => Value::from(foo),
497				"bar".to_owned() => Value::from(bar),
498			}
499			.into(),
500		);
501		assert_eq!(value, expected);
502		assert_eq!(expected.clone(), to_value(expected).unwrap());
503	}
504
505	#[test]
506	fn none() {
507		let option: Option<Value> = None;
508		let serialized = to_value(option).unwrap();
509		assert_eq!(Value::None, serialized);
510	}
511
512	#[test]
513	fn some() {
514		let option = Some(Value::Bool(true));
515		let serialized = to_value(option).unwrap();
516		assert_eq!(Value::Bool(true), serialized);
517	}
518
519	#[test]
520	fn empty_map() {
521		let map: BTreeMap<String, Value> = Default::default();
522		let serialized = to_value(map).unwrap();
523		assert_eq!(Value::Object(Default::default()), serialized);
524	}
525
526	#[test]
527	fn map() {
528		let map = map! {
529			String::from("foo") => Value::from("bar"),
530		};
531		let serialized = to_value(map.clone()).unwrap();
532		assert_eq!(serialized, map.into());
533	}
534
535	#[test]
536	fn empty_vec() {
537		let vec: Vec<Value> = Vec::new();
538		let serialized = to_value(vec).unwrap();
539		assert_eq!(Value::Array(Default::default()), serialized);
540	}
541
542	#[test]
543	fn vec() {
544		let vec = vec![Value::default()];
545		let serialized = to_value(vec).unwrap();
546		assert_eq!(Value::Array(vec![Value::None].into()), serialized);
547	}
548}