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 std::ops::Bound;
193
194	#[test]
195	fn value_none() {
196		let expected = Value::None;
197		assert_eq!(expected, to_value(None::<u32>).unwrap());
198		assert_eq!(expected.clone(), to_value(expected).unwrap());
199	}
200
201	#[test]
202	fn null() {
203		let expected = Value::Null;
204		assert_eq!(expected.clone(), to_value(expected).unwrap());
205	}
206
207	#[test]
208	fn r#false() {
209		let expected = Value::Bool(false);
210		assert_eq!(expected, to_value(false).unwrap());
211		assert_eq!(expected.clone(), to_value(expected).unwrap());
212	}
213
214	#[test]
215	fn r#true() {
216		let expected = Value::Bool(true);
217		assert_eq!(expected, to_value(true).unwrap());
218		assert_eq!(expected.clone(), to_value(expected).unwrap());
219	}
220
221	#[test]
222	fn number() {
223		let number = Number::Int(Default::default());
224		let value = to_value(number).unwrap();
225		let expected = Value::Number(number);
226		assert_eq!(value, expected);
227		assert_eq!(expected.clone(), to_value(expected).unwrap());
228
229		let number = Number::Float(Default::default());
230		let value = to_value(number).unwrap();
231		let expected = Value::Number(number);
232		assert_eq!(value, expected);
233		assert_eq!(expected.clone(), to_value(expected).unwrap());
234
235		let number = Number::Decimal(Default::default());
236		let value = to_value(number).unwrap();
237		let expected = Value::Number(number);
238		assert_eq!(value, expected);
239		assert_eq!(expected.clone(), to_value(expected).unwrap());
240	}
241
242	#[test]
243	fn strand() {
244		let strand = Strand("foobar".to_owned());
245		let value = to_value(strand.clone()).unwrap();
246		let expected = Value::Strand(strand);
247		assert_eq!(value, expected);
248		assert_eq!(expected.clone(), to_value(expected).unwrap());
249
250		let strand = "foobar".to_owned();
251		let value = to_value(strand.clone()).unwrap();
252		let expected = Value::Strand(strand.into());
253		assert_eq!(value, expected);
254		assert_eq!(expected.clone(), to_value(expected).unwrap());
255
256		let strand = "foobar";
257		let value = to_value(strand).unwrap();
258		let expected = Value::Strand(strand.into());
259		assert_eq!(value, expected);
260		assert_eq!(expected.clone(), to_value(expected).unwrap());
261	}
262
263	#[test]
264	fn duration() {
265		let duration = Duration::default();
266		let value = to_value(duration).unwrap();
267		let expected = Value::Duration(duration);
268		assert_eq!(value, expected);
269		assert_eq!(expected.clone(), to_value(expected).unwrap());
270	}
271
272	#[test]
273	fn datetime() {
274		let datetime = Datetime::default();
275		let value = to_value(datetime.clone()).unwrap();
276		let expected = Value::Datetime(datetime);
277		assert_eq!(value, expected);
278		assert_eq!(expected.clone(), to_value(expected).unwrap());
279	}
280
281	#[test]
282	fn uuid() {
283		let uuid = Uuid::default();
284		let value = to_value(uuid).unwrap();
285		let expected = Value::Uuid(uuid);
286		assert_eq!(value, expected);
287		assert_eq!(expected.clone(), to_value(expected).unwrap());
288	}
289
290	#[test]
291	fn array() {
292		let array = Array::default();
293		let value = to_value(array.clone()).unwrap();
294		let expected = Value::Array(array);
295		assert_eq!(value, expected);
296		assert_eq!(expected.clone(), to_value(expected).unwrap());
297	}
298
299	#[test]
300	fn object() {
301		let object = Object::default();
302		let value = to_value(object.clone()).unwrap();
303		let expected = Value::Object(object);
304		assert_eq!(value, expected);
305		assert_eq!(expected.clone(), to_value(expected).unwrap());
306	}
307
308	#[test]
309	fn geometry() {
310		let geometry = Geometry::Collection(Vec::new());
311		let value = to_value(geometry.clone()).unwrap();
312		let expected = Value::Geometry(geometry);
313		assert_eq!(value, expected);
314		assert_eq!(expected.clone(), to_value(expected).unwrap());
315	}
316
317	#[test]
318	fn bytes() {
319		let bytes = Bytes("foobar".as_bytes().to_owned());
320		let value = to_value(bytes.clone()).unwrap();
321		let expected = Value::Bytes(bytes);
322		assert_eq!(value, expected);
323		assert_eq!(expected.clone(), to_value(expected).unwrap());
324	}
325
326	#[test]
327	fn param() {
328		let param = Param::default();
329		let value = to_value(param.clone()).unwrap();
330		let expected = Value::Param(param);
331		assert_eq!(value, expected);
332		assert_eq!(expected.clone(), to_value(expected).unwrap());
333	}
334
335	#[test]
336	fn idiom() {
337		let idiom = Idiom::default();
338		let value = to_value(idiom.clone()).unwrap();
339		let expected = Value::Idiom(idiom);
340		assert_eq!(value, expected);
341		assert_eq!(expected.clone(), to_value(expected).unwrap());
342	}
343
344	#[test]
345	fn table() {
346		let table = Table("foo".to_owned());
347		let value = to_value(table.clone()).unwrap();
348		let expected = Value::Table(table);
349		assert_eq!(value, expected);
350		assert_eq!(expected.clone(), to_value(expected).unwrap());
351	}
352
353	#[test]
354	fn thing() {
355		let record_id = sql::thing("foo:bar").unwrap();
356		let value = to_value(record_id.clone()).unwrap();
357		let expected = Value::Thing(record_id);
358		assert_eq!(value, expected);
359		assert_eq!(expected.clone(), to_value(expected).unwrap());
360	}
361
362	#[test]
363	fn model() {
364		let model = Mock::Count("foo".to_owned(), Default::default());
365		let value = to_value(model.clone()).unwrap();
366		let expected = Value::Mock(model);
367		assert_eq!(value, expected);
368		assert_eq!(expected.clone(), to_value(expected).unwrap());
369	}
370
371	#[test]
372	fn regex() {
373		let regex = "abc".parse::<Regex>().unwrap();
374		let value = to_value(regex.clone()).unwrap();
375		let expected = Value::Regex(regex);
376		assert_eq!(value, expected);
377		assert_eq!(expected.clone(), to_value(expected).unwrap());
378	}
379
380	#[test]
381	fn block() {
382		let block: Box<Block> = Default::default();
383		let value = to_value(block.clone()).unwrap();
384		let expected = Value::Block(block);
385		assert_eq!(value, expected);
386		assert_eq!(expected.clone(), to_value(expected).unwrap());
387	}
388
389	#[test]
390	fn range() {
391		let range = Box::new(Range {
392			beg: Bound::Included("foo".into()),
393			end: Bound::Unbounded,
394		});
395		let value = to_value(range.clone()).unwrap();
396		let expected = Value::Range(range);
397		assert_eq!(value, expected);
398		assert_eq!(expected.clone(), to_value(expected).unwrap());
399	}
400
401	#[test]
402	fn edges() {
403		let edges = Box::new(Edges {
404			dir: Dir::In,
405			from: sql::thing("foo:bar").unwrap(),
406			what: Tables(vec!["foo".into()]),
407		});
408		let value = to_value(edges.clone()).unwrap();
409		let expected = Value::Edges(edges);
410		assert_eq!(value, expected);
411		assert_eq!(expected.clone(), to_value(expected).unwrap());
412	}
413
414	#[test]
415	fn future() {
416		let future = Box::new(Future(Value::default().into()));
417		let value = to_value(future.clone()).unwrap();
418		let expected = Value::Future(future);
419		assert_eq!(value, expected);
420		assert_eq!(expected.clone(), to_value(expected).unwrap());
421
422		let future = Box::new(Future(Block(vec![Entry::Create(CreateStatement::default())])));
423		let value = to_value(future.clone()).unwrap();
424		let expected = Value::Future(future);
425		assert_eq!(value, expected);
426		assert_eq!(expected.clone(), to_value(expected).unwrap());
427	}
428
429	#[test]
430	fn constant() {
431		let constant = Constant::MathPi;
432		let value = to_value(constant.clone()).unwrap();
433		let expected = Value::Constant(constant);
434		assert_eq!(value, expected);
435		assert_eq!(expected.clone(), to_value(expected).unwrap());
436	}
437
438	#[test]
439	fn function() {
440		let function = Box::new(Function::Normal(Default::default(), Default::default()));
441		let value = to_value(function.clone()).unwrap();
442		let expected = Value::Function(function);
443		assert_eq!(value, expected);
444		assert_eq!(expected.clone(), to_value(expected).unwrap());
445	}
446
447	#[test]
448	fn query() {
449		let query = sql::parse("SELECT * FROM foo").unwrap();
450		let value = to_value(query.clone()).unwrap();
451		let expected = Value::Query(query);
452		assert_eq!(value, expected);
453		assert_eq!(expected.clone(), to_value(expected).unwrap());
454	}
455
456	#[test]
457	fn subquery() {
458		let subquery = Box::new(Subquery::Value(Value::None));
459		let value = to_value(subquery.clone()).unwrap();
460		let expected = Value::Subquery(subquery);
461		assert_eq!(value, expected);
462		assert_eq!(expected.clone(), to_value(expected).unwrap());
463	}
464
465	#[test]
466	fn expression() {
467		let expression = Box::new(Expression::Binary {
468			l: "foo".into(),
469			o: Operator::Equal,
470			r: "Bar".into(),
471		});
472		let value = to_value(expression.clone()).unwrap();
473		let expected = Value::Expression(expression);
474		assert_eq!(value, expected);
475		assert_eq!(expected.clone(), to_value(expected).unwrap());
476	}
477
478	#[test]
479	fn unknown_struct() {
480		#[derive(Debug, Serialize)]
481		struct FooBar {
482			foo: String,
483			bar: i32,
484		}
485
486		let foo = "Foo";
487		let bar = Default::default();
488		let foo_bar = FooBar {
489			bar,
490			foo: foo.to_owned(),
491		};
492		let value = to_value(foo_bar).unwrap();
493		let expected = Value::Object(
494			map! {
495				"foo".to_owned() => Value::from(foo),
496				"bar".to_owned() => Value::from(bar),
497			}
498			.into(),
499		);
500		assert_eq!(value, expected);
501		assert_eq!(expected.clone(), to_value(expected).unwrap());
502	}
503
504	#[test]
505	fn none() {
506		let option: Option<Value> = None;
507		let serialized = to_value(option).unwrap();
508		assert_eq!(Value::None, serialized);
509	}
510
511	#[test]
512	fn some() {
513		let option = Some(Value::Bool(true));
514		let serialized = to_value(option).unwrap();
515		assert_eq!(Value::Bool(true), serialized);
516	}
517
518	#[test]
519	fn empty_map() {
520		let map: BTreeMap<String, Value> = Default::default();
521		let serialized = to_value(map).unwrap();
522		assert_eq!(Value::Object(Default::default()), serialized);
523	}
524
525	#[test]
526	fn map() {
527		let map = map! {
528			String::from("foo") => Value::from("bar"),
529		};
530		let serialized = to_value(map.clone()).unwrap();
531		assert_eq!(serialized, map.into());
532	}
533
534	#[test]
535	fn empty_vec() {
536		let vec: Vec<Value> = Vec::new();
537		let serialized = to_value(vec).unwrap();
538		assert_eq!(Value::Array(Default::default()), serialized);
539	}
540
541	#[test]
542	fn vec() {
543		let vec = vec![Value::default()];
544		let serialized = to_value(vec).unwrap();
545		assert_eq!(Value::Array(vec![Value::None].into()), serialized);
546	}
547}