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
19pub 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}