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