1use std::{any::type_name, fmt, mem};
23use bigdecimal::{BigDecimal, ToPrimitive};
24use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc};
25use serde::{Serialize, Deserialize, Serializer, Deserializer, de, ser::SerializeMap};
26use serde_json::Map;
27use uuid::Uuid;
28use indexmap::{IndexMap};
29use serde::de::{MapAccess, Visitor};
30
31use crate::error::{ConvertError, AkitaDataError};
32use crate::{Row};
33
34#[derive(Debug, Clone, PartialEq)]
35pub enum Value {
36 Null,
37 Bool(bool),
38 Tinyint(i8),
39 Smallint(i16),
40 Int(i32),
41 Bigint(i64),
42 Float(f32),
43 Double(f64),
44 BigDecimal(BigDecimal),
45 Blob(Vec<u8>),
46 Char(char),
47 Text(String),
48 Json(serde_json::Value),
49 Uuid(Uuid),
50 Date(NaiveDate),
51 Time(NaiveTime),
52 DateTime(NaiveDateTime),
53 Timestamp(DateTime<Utc>),
54 Interval(Interval),
55 Object(IndexMap<String, Value>),
56 Array(Array),
57}
58
59impl Serialize for Value {
61 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62 where
63 S: Serializer,
64 {
65 match self {
66 Value::Null => serializer.serialize_unit(),
67 Value::Bool(b) => serializer.serialize_bool(*b),
68 Value::Tinyint(i) => serializer.serialize_i8(*i),
69 Value::Smallint(i) => serializer.serialize_i16(*i),
70 Value::Int(i) => serializer.serialize_i32(*i),
71 Value::Bigint(i) => serializer.serialize_i64(*i),
72 Value::Float(f) => serializer.serialize_f32(*f),
73 Value::Double(f) => serializer.serialize_f64(*f),
74 Value::BigDecimal(bd) => serializer.serialize_str(&bd.to_string()),
75 Value::Blob(blob) => serializer.serialize_bytes(blob),
76 Value::Char(c) => serializer.serialize_char(*c),
77 Value::Text(s) => serializer.serialize_str(s),
78 Value::Json(value) => value.serialize(serializer),
79 Value::Uuid(uuid) => serializer.serialize_str(&uuid.to_string()),
80 Value::Date(date) => serializer.serialize_str(&date.to_string()),
81 Value::Time(time) => serializer.serialize_str(&time.to_string()),
82 Value::DateTime(dt) => serializer.serialize_str(&dt.to_string()),
83 Value::Timestamp(ts) => serializer.serialize_str(&ts.to_rfc3339()),
84 Value::Interval(interval) => serializer.serialize_str(&interval.to_string()),
85 Value::Object(map) => {
86 let mut obj = serializer.serialize_map(Some(map.len()))?;
87 for (key, value) in map {
88 obj.serialize_entry(key, value)?;
89 }
90 obj.end()
91 }
92 Value::Array(arr) => serializer.collect_str(&serde_json::to_string(&arr).unwrap_or_default()),
93 }
94 }
95}
96
97impl<'de> Deserialize<'de> for Value {
99 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
100 where
101 D: Deserializer<'de>,
102 {
103 struct ValueVisitor;
104
105 impl<'de> Visitor<'de> for ValueVisitor {
106 type Value = Value;
107
108 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
109 formatter.write_str("a valid Value variant")
110 }
111
112 fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E> {
113 Ok(Value::Bool(value))
114 }
115
116 fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E> {
117 Ok(Value::Tinyint(value))
118 }
119
120 fn visit_i16<E>(self, value: i16) -> Result<Self::Value, E> {
121 Ok(Value::Smallint(value))
122 }
123
124 fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E> {
125 Ok(Value::Int(value))
126 }
127
128 fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E> {
129 Ok(Value::Bigint(value))
130 }
131
132 fn visit_f32<E>(self, value: f32) -> Result<Self::Value, E> {
133 Ok(Value::Float(value))
134 }
135
136 fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E> {
137 Ok(Value::Double(value))
138 }
139
140 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
141 where
142 E: de::Error,
143 {
144 if let Ok(uuid) = value.parse::<Uuid>() {
145 return Ok(Value::Uuid(uuid));
146 }
147 if let Ok(date) = value.parse::<NaiveDate>() {
148 return Ok(Value::Date(date));
149 }
150 if let Ok(time) = value.parse::<NaiveTime>() {
151 return Ok(Value::Time(time));
152 }
153 if let Ok(dt) = value.parse::<NaiveDateTime>() {
154 return Ok(Value::DateTime(dt));
155 }
156 if let Ok(ts) = value.parse::<DateTime<Utc>>() {
157 return Ok(Value::Timestamp(ts));
158 }
159 if let Ok(bd) = value.parse::<BigDecimal>() {
160 return Ok(Value::BigDecimal(bd));
161 }
162 Ok(Value::Text(value.to_string()))
163 }
164
165 fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
166 where
167 M: MapAccess<'de>,
168 {
169 let mut object = IndexMap::new();
170 while let Some((key, value)) = map.next_entry()? {
171 object.insert(key, value);
172 }
173 Ok(Value::Object(object))
174 }
175
176 }
177
178 deserializer.deserialize_any(ValueVisitor)
179 }
180}
181
182impl Default for Value {
183 fn default() -> Self {
184 Value::Null
185 }
186}
187
188#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
189pub struct Interval {
190 pub microseconds: i64,
191 pub days: i32,
192 pub months: i32,
193}
194
195impl Interval {
196 pub fn new(microseconds: i64, days: i32, months: i32) -> Self {
197 Interval {
198 microseconds,
199 days,
200 months,
201 }
202 }
203
204}
205
206impl ToString for Interval {
207 fn to_string(&self) -> String {
208 format!("{}-{}-{}", self.months, self.days, self.microseconds)
209 }
210}
211
212impl Value {
213
214 pub fn is_string(&self) -> bool {
215 self.as_str().is_some()
216 }
217
218 pub fn is_object(&self) -> bool {
219 self.as_object().is_some()
220 }
221
222 pub fn as_object(&self) -> Option<&IndexMap<String, Value>> {
223 match *self {
224 Value::Object(ref map) => Some(map),
225 _ => None,
226 }
227 }
228
229 pub fn as_object_mut(&mut self) -> Option<&mut IndexMap<String, Value>> {
230 match *self {
231 Value::Object(ref mut map) => Some(map),
232 _ => None,
233 }
234 }
235
236 pub fn is_array(&self) -> bool {
237 self.as_array().is_some()
238 }
239
240 pub fn as_array(&self) -> Option<&Array> {
241 match *self {
242 Value::Array(ref array) => Some(array),
243 _ => None,
244 }
245 }
246
247 pub fn as_str(&self) -> Option<&str> {
248 match *self {
249 Value::Text(ref s) => Some(s.as_str()),
250 _ => None,
251 }
252 }
253
254 pub fn is_number(&self) -> bool {
255 match *self {
256 Value::Tinyint(_) | Value::Smallint(_) | Value::Int(_)
257 | Value::Bigint(_) | Value::Float(_) | Value::BigDecimal(_) | Value::Double(_) => true,
258 _ => false,
259 }
260 }
261
262 pub fn is_boolean(&self) -> bool {
263 self.as_bool().is_some()
264 }
265
266 pub fn as_bool(&self) -> Option<bool> {
267 match *self {
268 Value::Bool(b) => Some(b),
269 _ => None,
270 }
271 }
272
273 pub fn is_null(&self) -> bool {
274 self.as_null().is_some()
275 }
276
277 pub fn as_null(&self) -> Option<()> {
278 match *self {
279 Value::Null => Some(()),
280 _ => None,
281 }
282 }
283
284 pub fn take(&mut self) -> Value {
285 mem::replace(self, Value::Null)
286 }
287
288 pub fn new_object() -> Self { Value::Object(IndexMap::new()) }
289
290 pub fn insert_obj<K, V>(&mut self, k: K, v: V)
291 where
292 K: ToString,
293 V: ToValue,
294 {
295 match self {
296 Value::Object(data) => {data.insert(k.to_string().replace("r#",""), v.to_value());},
297 _ => (),
298 }
299 }
300
301 pub fn insert_obj_value<K>(&mut self, k: K, value: &Value)
302 where
303 K: ToString,
304 {
305 match self {
306 Value::Object(v) => {v.insert(k.to_string(), value.clone());},
307 _ => (),
308 }
309 }
310
311 pub fn get_obj<'a, T>(&'a self, s: &str) -> Result<T, AkitaDataError>
312 where
313 T: FromValue,
314 {
315 match self {
316 Value::Object(data) => match data.get(&s.replace("r#","")) {
317 Some(v) => {
318 let s = FromValue::from_value_opt(v);
319 s
320 },
321 None => Err(AkitaDataError::NoSuchValueError(s.into())),
322 },
323 _ => Err(AkitaDataError::ObjectValidError("Unsupported type".to_string())),
324 }
325 }
326
327 pub fn get_obj_len<'a>(&'a self) -> usize
328 {
329 match self {
330 Value::Object(data) => data.len(),
331 _ => 0,
332 }
333 }
334
335 pub fn get_obj_opt<'a, T>(&'a self, s: &str) -> Result<Option<T>, AkitaDataError>
336 where
337 T: FromValue,
338 {
339 match self {
340 Value::Object(data) => match data.get(&s.replace("r#","")) {
341 Some(v) => {
342 match v {
343 Value::Null => Ok(None),
344 _ => {
345 Ok(Some(
346 FromValue::from_value(v)
347 ))
348 }
349 }
350 }
351 None => Ok(None),
352 },
353 _ => Ok(None),
354 }
355 }
356
357 pub fn get_obj_value(&self, s: &str) -> Option<&Value> {
358 match self {
359 Value::Object(data) => data.get(s),
360 _ => None,
361 }
362 }
363
364 pub fn remove_obj(&mut self, s: &str) -> Option<Value> {
365 match self {
366 Value::Object(v) => v.shift_remove(s),
367 _ => None,
368 }
369 }
370
371 pub fn take_obj_raw<'a, T>(&'a self, index: usize) -> Option<T>
374 where
375 T: FromValue,
376 {
377 match self {
378 Value::Object(v) => v.get_index(index).and_then(|(_k, v)| Some(FromValue::from_value(v))),
379 _ => None,
380 }
381 }
382
383 pub fn take_obj_raw_opt<'a, T>(&'a self, index: usize) -> Option<Result<T, AkitaDataError>>
387 where
388 T: FromValue,
389 {
390 match self {
391 Value::Object(v) => v.get_index(index).and_then(|(_k, v)| Some(FromValue::from_value_opt(v))),
392 _ => Some(Err(AkitaDataError::ObjectValidError("Unsupported type".to_string()))),
393 }
394 }
395
396 #[doc(hidden)]
397 pub fn place(&mut self, index: usize, value: Value) {
398 match self {
399 Value::Object(v) => match v.get_index_mut(index) {
400 Some((_k, v)) => {
401 *v = value;
402 }
403 None => ()
404 }
405 _ => (),
406 }
407 }
408}
409
410impl fmt::Display for Value {
411 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
412 match self {
413 Value::Null => write!(f, "Null"),
414 Value::Bool(v) => write!(f, "{}", v),
415 Value::Tinyint(v) => write!(f, "{}", v),
416 Value::Smallint(v) => write!(f, "{}", v),
417 Value::Int(v) => write!(f, "{}", v),
418 Value::Bigint(v) => write!(f, "{}", v),
419 Value::Float(v) => write!(f, "{}", v),
420 Value::Double(v) => write!(f, "{}", v),
421 Value::BigDecimal(v) => write!(f, "{}", v),
422 Value::Char(v) => write!(f, "{}", v),
423 Value::Text(v) => write!(f, "{}", v),
424 Value::Json(v) => write!(f, "{}", serde_json::to_string(v).unwrap_or_default()),
425 Value::Uuid(v) => write!(f, "{}", v),
426 Value::Date(v) => write!(f, "{}", v),
427 Value::Time(v) => write!(f, "{}", v),
428 Value::DateTime(v) => write!(f, "{}", v.format("%Y-%m-%d %H:%M:%S").to_string()),
429 Value::Timestamp(v) => write!(f, "{}", v.to_rfc3339()),
430 Value::Array(array) => array.fmt(f),
431 Value::Blob(v) => {
432 write!(f, "{}", String::from_utf8_lossy(v))
433 }
434 _ => panic!("not yet implemented: {:?}", self),
435 }
436 }
437}
438
439
440#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
441pub enum Array {
442 Bool(Vec<bool>),
443 Tinyint(Vec<i8>),
444 Smallint(Vec<i16>),
445 Int(Vec<i64>),
446 Float(Vec<f64>),
447 Bigint(Vec<i64>),
448 Double(Vec<f64>),
449 BigDecimal(Vec<BigDecimal>),
450 Text(Vec<String>),
451 Json(Vec<serde_json::Value>),
452 Char(Vec<char>),
453 Uuid(Vec<Uuid>),
454 Date(Vec<NaiveDate>),
455 Timestamp(Vec<DateTime<Utc>>),
456}
457
458impl fmt::Display for Array {
459 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
460 match self {
461 Array::Text(texts) => {
462 write!(f, "[{}]", texts.join(","))
463 }
464 Array::Float(floats) => {
465 write!(f, "[{}]", serde_json::to_string(&floats).unwrap_or_default())
466 }
467 Array::Json(json) => {
468 write!(f, "{}", serde_json::to_string(&json).unwrap_or_default())
469 }
470 Array::Bool(bools) => {
471 write!(f, "[{}]", serde_json::to_string(&bools).unwrap_or_default())
472 }
473 Array::Tinyint(tinyints) => {
474 write!(f, "[{}]", serde_json::to_string(&tinyints).unwrap_or_default())
475 }
476 Array::Smallint(smallints) => {
477 write!(f, "[{}]", serde_json::to_string(&smallints).unwrap_or_default())
478 }
479 Array::Int(ints) => {
480 write!(f, "[{}]", serde_json::to_string(&ints).unwrap_or_default())
481 }
482 Array::Bigint(bigints) => {
483 write!(f, "[{}]", serde_json::to_string(&bigints).unwrap_or_default())
484 }
485 Array::Double(doubles) => {
486 write!(f, "[{}]", serde_json::to_string(&doubles).unwrap_or_default())
487 }
488 Array::BigDecimal(bigdecimals) => {
489 let fmt = bigdecimals.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(",");
490 write!(f, "[{}]", fmt)
491 }
492 Array::Char(chars) => {
493 write!(f, "[{}]", serde_json::to_string(&chars).unwrap_or_default())
494 }
495 Array::Uuid(uuids) => {
496 let fmt = uuids.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(",");
497 write!(f, "[{}]", fmt)
498 }
499 Array::Date(dates) => {
500 write!(f, "[{}]", serde_json::to_string(&dates).unwrap_or_default())
501 }
502 Array::Timestamp(timestamps) => {
503 write!(f, "[{}]", serde_json::to_string(×tamps).unwrap_or_default())
504 }
505 }
507 }
508}
509
510pub trait ToValue {
513 fn to_value(&self) -> Value;
514}
515
516macro_rules! impl_to_value {
517 ($ty:ty, $variant:ident) => {
518 impl ToValue for $ty {
519 fn to_value(&self) -> Value {
520 Value::$variant(self.to_owned())
521 }
522 }
523 };
524}
525
526macro_rules! impl_usined_to_value {
527 ($ty:ty, $variant:ident, $target_variant:ident) => {
528 impl ToValue for $ty {
529 fn to_value(&self) -> Value {
530 Value::$variant(self.to_owned() as $target_variant)
531 }
532 }
533 };
534}
535
536impl_usined_to_value!(u8, Tinyint, i8);
537impl_usined_to_value!(u16, Smallint, i16);
538impl_usined_to_value!(u32, Int, i32);
539impl_usined_to_value!(u64, Bigint, i64);
540impl_usined_to_value!(usize, Bigint, i64);
541impl_usined_to_value!(isize, Bigint, i64);
542
543
544impl_to_value!(bool, Bool);
545impl_to_value!(i8, Tinyint);
546impl_to_value!(i16, Smallint);
547impl_to_value!(i32, Int);
548impl_to_value!(i64, Bigint);
549impl_to_value!(f32, Float);
550impl_to_value!(f64, Double);
551impl_to_value!(Vec<u8>, Blob);
552impl_to_value!(char, Char);
553impl_to_value!(String, Text);
554impl_to_value!(Uuid, Uuid);
555impl_to_value!(NaiveDate, Date);
556impl_to_value!(NaiveTime, Time);
557impl_to_value!(DateTime<Utc>, Timestamp);
558impl_to_value!(NaiveDateTime, DateTime);
559
560impl ToValue for &str {
561 fn to_value(&self) -> Value {
562 Value::Text(self.to_string())
563 }
564}
565
566impl ToValue for serde_json::Value {
567 fn to_value(&self) -> Value {
568 match self {
569 serde_json::Value::Null => Value::Null,
570 serde_json::Value::Bool(v) => Value::Bool(v.to_owned()),
571 serde_json::Value::Number(v) => {
572 if v.is_f64() {
573 Value::Double(v.as_f64().unwrap_or_default())
574 } else if v.is_i64() {
575 Value::Bigint(v.as_i64().unwrap_or_default())
576 } else if v.is_u64() {
577 Value::Bigint(v.as_u64().unwrap_or_default() as i64)
578 } else {
579 Value::Int(0)
580 }
581 },
582 serde_json::Value::String(v) => Value::Text(v.to_owned()),
583 serde_json::Value::Array(v) => v.to_value(),
584 serde_json::Value::Object(data) => {
585 let mut map: IndexMap<String, Value> = IndexMap::new();
586 for key in data.keys() {
587 if let Some(v) = self.get(key) {
588 map.insert(key.to_string(), serde_json::Value::to_value(v));
589 }
590 }
591 Value::Object(map)
592 },
593 }
594 }
595}
596
597impl ToValue for Vec<String> {
598 fn to_value(&self) -> Value {
599 Value::Array(Array::Text(self.to_owned()))
600 }
601}
602
603impl ToValue for Vec<serde_json::Value> {
604 fn to_value(&self) -> Value {
605 if self.is_empty() {
606 return Value::Null
607 }
608 let mut int_values = Vec::new();
609 let mut float_values = Vec::new();
610 let mut text_values = Vec::new();
611 let mut obj_values = Vec::new();
612 for v in self {
613 if v.is_f64() {
614 float_values.push(v.as_f64().unwrap_or_default());
615 } else if v.is_i64() {
616 int_values.push(v.as_i64().unwrap_or_default());
617 } else if v.is_u64() {
618 int_values.push(v.as_i64().unwrap_or_default());
619 } else if v.is_string() {
620 text_values.push(v.as_str().unwrap_or_default().to_string());
621 } else if v.is_object() {
622 obj_values.push(v.to_owned());
623 } else {
624 text_values.push(v.to_string());
625 }
626 }
627 if !int_values.is_empty() {
628 Value::Array(Array::Int(int_values))
629 } else if !float_values.is_empty() {
630 Value::Array(Array::Float(float_values))
631 } else if !obj_values.is_empty() {
632 Value::Array(Array::Json(obj_values))
633 } else{
634 Value::Array(Array::Text(text_values))
635 }
636 }
637}
638
639impl<T> ToValue for Option<T>
640where
641 T: ToValue,
642{
643 fn to_value(&self) -> Value {
644
645 match self {
646 Some(v) => v.to_value(),
647 None => Value::Null,
648 }
649 }
650}
651
652impl ToValue for () {
653 fn to_value(&self) -> Value {
654 Value::Null
655 }
656}
657
658impl <T> ToValue for &T
659where
660 T: ToValue,
661{
662 fn to_value(&self) -> Value {
663 (*self).to_value()
664 }
665}
666
667impl ToValue for Row {
668 fn to_value(&self) -> Value {
669 let mut data = IndexMap::new();
670 for (i, col) in self.columns.iter().enumerate() {
671 data.insert(col.to_string(), self.data.get(i).map(|v| v.clone()).unwrap_or(Value::Null));
672 }
673 Value::Object(data)
674 }
675}
676
677impl <'a> From<&'a Value> for Value {
678 fn from(v: &'a Value) -> Value {
679 v.to_owned()
680 }
681}
682
683impl<T> From<T> for Value
684where
685 T: ToValue,
686{
687 fn from(v: T) -> Value {
688 v.to_value()
689 }
690}
691
692pub trait FromValue: Sized {
693 fn from_value(v: &Value) -> Self {
694 match Self::from_value_opt(v) {
695 Ok(x) => x,
696 Err(_err) => panic!(
697 "Couldn't from {:?} to type {}. (see FromValue documentation)",
698 v,
699 type_name::<Self>(),
700 ),
701 }
702 }
703
704 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError>;
705}
706
707macro_rules! impl_from_value {
708 ($ty: ty, $ty_name: tt, $($variant: ident),*) => {
709 impl FromValue for $ty {
711 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
712 match *v {
713 $(Value::$variant(ref v) => Ok(v.to_owned() as $ty),
714 )*
715 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(format!("{:?}",v), $ty_name.into()))),
716 }
717 }
718 }
719 }
720}
721
722macro_rules! impl_from_value_numeric {
723 ($ty: ty, $method:ident, $ty_name: tt, $($variant: ident),*) => {
724 impl FromValue for $ty {
725 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
726 match *v {
727 $(Value::$variant(ref v) => Ok(v.to_owned() as $ty),
728 )*
729 Value::BigDecimal(ref v) => Ok(v.$method().unwrap_or_default()),
730 Value::Object(ref v) => {
731 let (_, v) = v.first().unwrap_or((&String::default(), &Value::Null));
732 Ok(<$ty>::from_value(v))
733 },
734 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(format!("{:?}", v), $ty_name.into()))),
735 }
736 }
737 }
738 }
739}
740
741impl_from_value!(Vec<u8>, "Vec<u8>", Blob);
742impl_from_value!(char, "char", Char);
743impl_from_value!(Uuid, "Uuid", Uuid);
744impl_from_value!(NaiveDate, "NaiveDate", Date);
745
746impl_from_value_numeric!(i8, to_i8, "i8", Tinyint);
747impl_from_value_numeric!(isize, to_isize, "isize", Tinyint, Bigint, Int);
748impl_from_value_numeric!(u8, to_u8, "u8", Tinyint, Bigint, Int);
749impl_from_value_numeric!(u16, to_u16, "u16", Tinyint, Bigint, Int);
750impl_from_value_numeric!(u32, to_u32, "u32", Tinyint, Bigint, Int);
751impl_from_value_numeric!(u64, to_u64, "u64", Tinyint, Bigint, Int);
752impl_from_value_numeric!(usize, to_usize, "usize", Tinyint, Bigint, Int);
753impl_from_value_numeric!(i16, to_i16, "i16", Tinyint, Smallint);
754impl_from_value_numeric!(i32, to_i32, "i32", Tinyint, Smallint, Int, Bigint);
755impl_from_value_numeric!(i64, to_i64, "i64", Tinyint, Smallint, Int, Bigint);
756impl_from_value_numeric!(f32, to_f32, "f32", Float);
757impl_from_value_numeric!(f64, to_f64, "f64", Float, Double);
758
759impl FromValue for String {
762 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
763 match *v {
764 Value::Text(ref v) => Ok(v.to_owned()),
765 Value::Char(ref v) => {
766 let mut s = String::new();
767 s.push(*v);
768 Ok(s)
769 }
770 Value::Blob(ref v) => String::from_utf8(v.to_owned()).map_err(|e| {
771 AkitaDataError::ConvertError(ConvertError::NotSupported(format!("{:?}", v), format!("String: {}", e)))
772 }),
773 Value::Bool(ref v) => Ok(v.to_string()),
774 Value::Tinyint(ref v) => Ok(v.to_string()),
775 Value::Smallint(ref v) => Ok(v.to_string()),
776 Value::Int(ref v) => Ok(v.to_string()),
777 Value::Bigint(ref v) => Ok(v.to_string()),
778 Value::Float(ref v) => Ok(v.to_string()),
779 Value::Double(ref v) => Ok(v.to_string()),
780 Value::BigDecimal(ref v) => Ok(v.to_string()),
781 Value::Json(ref v) => Ok(serde_json::to_string(v).unwrap_or_default()),
782 Value::Uuid(ref v) => Ok(v.to_string()),
783 Value::Date(ref v) => Ok(v.to_string()),
784 Value::Time(ref v) => Ok(v.to_string()),
785 Value::DateTime(ref v) => Ok(v.to_string()),
786 Value::Timestamp(ref v) => Ok(v.to_string()),
787 Value::Array(ref v) => {
788 match v {
789 Array::Int(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
790 Array::Float(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
791 Array::Text(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
792 Array::Json(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
793 Array::Bool(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
794 Array::Tinyint(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
795 Array::Smallint(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
796 Array::Bigint(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
797 Array::BigDecimal(vv) => Ok(vv.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(",")),
798 Array::Date(vv) => Ok(vv.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(",")),
799 Array::Timestamp(vv) => Ok(vv.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(",")),
800 Array::Uuid(vv) => Ok(vv.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(",")),
801 Array::Double(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
802 Array::Char(vv) => Ok(serde_json::to_string(vv).unwrap_or_default()),
803 }
804 }
805 Value::Object(ref obj) => {
806 let data: IndexMap<String, Value> = obj.to_owned();
807 if data.len() > 0 {
808 let (_k, v) = data.get_index(0).unwrap();
809 Ok(v.as_str().to_owned().unwrap_or_default().to_string())
810 } else {
811 Ok(String::default())
812 }
813 }
814 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
815 format!("{:?}", v),
816 "String".to_string(),
817 ))),
818
819 }
820 }
821}
822
823impl FromValue for Vec<String> {
824 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
825 match *v {
826 Value::Array(Array::Text(ref t)) => Ok(t.to_owned()),
827 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
828 format!("{:?}", v),
829 "Vec<String>".to_string(),
830 ))),
831 }
832 }
833}
834
835impl FromValue for () {
836 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
837 match *v {
838 Value::Null => Ok(()),
839 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
840 format!("{:?}", v),
841 "Vec<String>".to_string(),
842 ))),
843 }
844 }
845}
846
847impl FromValue for bool {
848 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
849 match *v {
850 Value::Bool(v) => Ok(v),
851 Value::Tinyint(v) => Ok(v == 1),
852 Value::Smallint(v) => Ok(v == 1),
853 Value::Int(v) => Ok(v == 1),
854 Value::Bigint(v) => Ok(v == 1),
855 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
856 format!("{:?}", v),
857 "bool".to_string(),
858 ))),
859 }
860 }
861}
862
863impl FromValue for serde_json::Value {
864 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
865 match v.clone() {
866 Value::Bool(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
867 Value::Null => Ok(serde_json::Value::Null),
868 Value::Tinyint(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
869 Value::Smallint(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
870 Value::Int(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
871 Value::Bigint(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
872 Value::Float(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
873 Value::Double(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
874 Value::Blob(v) => serde_json::from_slice(&v).map_err(AkitaDataError::from),
875 Value::Char(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
876 Value::Text(v) => Ok(serde_json::Value::String(v)),
877 Value::Json(v) => Ok(v), Value::Uuid(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
879 Value::Date(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
880 Value::Time(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
881 Value::DateTime(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
882 Value::Timestamp(v) => serde_json::to_value(v).map_err(AkitaDataError::from),
883 Value::Object(v) => {
885 let mut data = Map::new();
886 for (k, v) in v.into_iter() {
887 data.insert(k, serde_json::Value::from_value(&v));
888 }
889 Ok(serde_json::Value::Object(data))
890 },
891 Value::Array(v) => serde_json::to_value(v).map_err(|err| AkitaDataError::from(err)),
892 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
893 format!("{:?}", v),
894 "SerdeJson".to_string(),
895 ))),
896 }
897 }
898}
899
900impl FromValue for DateTime<Utc> {
901 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
902 match *v {
903 Value::Text(ref v) => Ok(DateTime::<Utc>::from_naive_utc_and_offset(parse_naive_date_time(v), Utc)),
904 Value::DateTime(v) => Ok(DateTime::<Utc>::from_naive_utc_and_offset(v, Utc)),
905 Value::Timestamp(v) => Ok(v),
906 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
907 format!("{:?}", v),
908 "DateTime".to_string(),
909 ))),
910 }
911 }
912}
913
914impl FromValue for NaiveDateTime {
915 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
916 match *v {
917 Value::Text(ref v) => Ok(parse_naive_date_time(v)),
918 Value::DateTime(v) => Ok(v),
919 _ => Err(AkitaDataError::ConvertError(ConvertError::NotSupported(
920 format!("{:?}", v),
921 "NaiveDateTime".to_string(),
922 ))),
923 }
924 }
925}
926
927impl<T> FromValue for Option<T>
928where
929 T: FromValue,
930{
931 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
932 match *v {
933 Value::Null => Ok(None),
934 _ => FromValue::from_value_opt(v).map(Some),
935 }
936 }
937}
938
939impl FromValue for Vec<Value> {
940 fn from_value_opt(_v: &Value) -> Result<Self, AkitaDataError> {
941 Ok(vec![])
942 }
943}
944
945impl<T> FromValue for &T
946where
947 T: FromValue,
948{
949 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
950 match *v {
951 Value::Null => Err(AkitaDataError::NoSuchValueError(format!("{:?} can not get value", v))),
952 _ => FromValue::from_value_opt(v),
953 }
954
955 }
956}
957
958
959impl FromValue for Value
960{
961 fn from_value_opt(v: &Value) -> Result<Self, AkitaDataError> {
962 Ok(v.to_owned())
963 }
964}
965
966fn parse_naive_date_time(v: &str) -> NaiveDateTime {
967 let ts = NaiveDateTime::parse_from_str(&v, "%Y-%m-%d %H:%M:%S");
968 if let Ok(ts) = ts {
969 ts
970 } else {
971 let ts = NaiveDateTime::parse_from_str(&v, "%Y-%m-%d %H:%M:%S%.3f");
972 if let Ok(ts) = ts {
973 ts
974 } else {
975 panic!("unable to parse timestamp: {}", v);
976 }
977 }
978}
979
980
981macro_rules! take_or_place {
982 ($row:expr, $index:expr, $t:ident) => (
983 match $row.take_obj_raw($index) {
984 Some(v) => v,
985 None => return Err(AkitaDataError::NoSuchValueError(format!("{:?} can not get value", $row))),
986 }
987 );
988 ($row:expr, $index:expr, $t:ident, $( [$idx:expr, $ir:expr] ),*) => (
989 match $row.take_obj_raw($index) {
990 Some(v) => v,
991 None => return Err(AkitaDataError::NoSuchValueError(format!("{:?} can not get value", $row))),
992 }
993 );
994}
995
996
997impl <T1> FromValue for (T1,)
998where T1: FromValue {
999 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1000 T1::from_value_opt(data).map(|t| (t,))
1001 }
1002}
1003
1004impl<T1, T2> FromValue for (T1, T2)
1005where
1006 T1: FromValue,
1007 T2: FromValue,
1008{
1009 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1010 if data.get_obj_len() != 2 {
1011 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1012 }
1013 let ir1 = take_or_place!(data, 0, T1);
1014 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1015 Ok((ir1, ir2))
1016 }
1017}
1018
1019impl<T1, T2, T3> FromValue for (T1, T2, T3)
1020where
1021 T1: FromValue,
1022 T2: FromValue,
1023 T3: FromValue,
1024{
1025 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1026 if data.get_obj_len() != 3 {
1027 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1028 }
1029 let ir1 = take_or_place!(data, 0, T1);
1030 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1031 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1032 Ok((ir1, ir2, ir3))
1033 }
1034}
1035
1036impl<T1, T2, T3, T4> FromValue for (T1, T2, T3, T4)
1037where
1038 T1: FromValue,
1039 T2: FromValue,
1040 T3: FromValue,
1041 T4: FromValue,
1042{
1043 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1044 if data.get_obj_len() != 4 {
1045 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1046 }
1047 let ir1 = take_or_place!(data, 0, T1);
1048 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1049 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1050 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1051 Ok((ir1, ir2, ir3, ir4))
1052 }
1053}
1054
1055impl<T1, T2, T3, T4, T5> FromValue for (T1, T2, T3, T4, T5)
1056where
1057 T1: FromValue,
1058 T2: FromValue,
1059 T3: FromValue,
1060 T4: FromValue,
1061 T5: FromValue,
1062{
1063 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1064 if data.get_obj_len() != 5 {
1065 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1066 }
1067 let ir1 = take_or_place!(data, 0, T1);
1068 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1069 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1070 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1071 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1072 Ok((ir1, ir2, ir3, ir4, ir5))
1073 }
1074}
1075
1076
1077impl<T1, T2, T3, T4, T5, T6> FromValue for (T1, T2, T3, T4, T5, T6)
1078where
1079 T1: FromValue,
1080 T2: FromValue,
1081 T3: FromValue,
1082 T4: FromValue,
1083 T5: FromValue,
1084 T6: FromValue,
1085{
1086 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1087 if data.get_obj_len() != 6 {
1088 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1089 }
1090 let ir1 = take_or_place!(data, 0, T1);
1091 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1092 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1093 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1094 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1095 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1096 Ok((ir1, ir2, ir3, ir4, ir5, ir6))
1097 }
1098}
1099
1100
1101impl<T1, T2, T3, T4, T5, T6, T7> FromValue for (T1, T2, T3, T4, T5, T6, T7)
1102where
1103 T1: FromValue,
1104 T2: FromValue,
1105 T3: FromValue,
1106 T4: FromValue,
1107 T5: FromValue,
1108 T6: FromValue,
1109 T7: FromValue,
1110{
1111 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1112 if data.get_obj_len() != 7 {
1113 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1114 }
1115 let ir1 = take_or_place!(data, 0, T1);
1116 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1117 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1118 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1119 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1120 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1121 let ir7 = take_or_place!(data, 6, T7, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6]);
1122 Ok((ir1, ir2, ir3, ir4, ir5, ir6, ir7))
1123 }
1124}
1125
1126
1127
1128
1129impl<T1, T2, T3, T4, T5, T6, T7, T8> FromValue for (T1, T2, T3, T4, T5, T6, T7, T8)
1130where
1131 T1: FromValue,
1132 T2: FromValue,
1133 T3: FromValue,
1134 T4: FromValue,
1135 T5: FromValue,
1136 T6: FromValue,
1137 T7: FromValue,
1138 T8: FromValue,
1139{
1140 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1141 if data.get_obj_len() !=8 {
1142 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1143 }
1144 let ir1 = take_or_place!(data, 0, T1);
1145 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1146 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1147 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1148 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1149 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1150 let ir7 = take_or_place!(data, 6, T7, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6]);
1151 let ir8 = take_or_place!(data, 7, T8, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7]);
1152 Ok((ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8))
1153 }
1154}
1155
1156
1157impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> FromValue for (T1, T2, T3, T4, T5, T6, T7, T8, T9)
1158where
1159 T1: FromValue,
1160 T2: FromValue,
1161 T3: FromValue,
1162 T4: FromValue,
1163 T5: FromValue,
1164 T6: FromValue,
1165 T7: FromValue,
1166 T8: FromValue,
1167 T9: FromValue,
1168{
1169 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1170 if data.get_obj_len() !=9 {
1171 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1172 }
1173 let ir1 = take_or_place!(data, 0, T1);
1174 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1175 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1176 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1177 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1178 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1179 let ir7 = take_or_place!(data, 6, T7, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6]);
1180 let ir8 = take_or_place!(data, 7, T8, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7]);
1181 let ir9 = take_or_place!(data, 8, T9, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8]);
1182 Ok((ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8, ir9))
1183 }
1184}
1185
1186
1187
1188impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> FromValue for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
1189where
1190 T1: FromValue,
1191 T2: FromValue,
1192 T3: FromValue,
1193 T4: FromValue,
1194 T5: FromValue,
1195 T6: FromValue,
1196 T7: FromValue,
1197 T8: FromValue,
1198 T9: FromValue,
1199 T10: FromValue,
1200{
1201 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1202 if data.get_obj_len() !=10 {
1203 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1204 }
1205 let ir1 = take_or_place!(data, 0, T1);
1206 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1207 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1208 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1209 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1210 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1211 let ir7 = take_or_place!(data, 6, T7, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6]);
1212 let ir8 = take_or_place!(data, 7, T8, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7]);
1213 let ir9 = take_or_place!(data, 8, T9, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8]);
1214 let ir10 = take_or_place!(data, 9, T10, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8], [8, ir9]);
1215 Ok((ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8, ir9, ir10))
1216 }
1217}
1218
1219
1220
1221
1222impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> FromValue for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
1223where
1224 T1: FromValue,
1225 T2: FromValue,
1226 T3: FromValue,
1227 T4: FromValue,
1228 T5: FromValue,
1229 T6: FromValue,
1230 T7: FromValue,
1231 T8: FromValue,
1232 T9: FromValue,
1233 T10: FromValue,
1234 T11: FromValue,
1235{
1236 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1237 if data.get_obj_len() !=11 {
1238 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1239 }
1240 let ir1 = take_or_place!(data, 0, T1);
1241 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1242 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1243 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1244 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1245 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1246 let ir7 = take_or_place!(data, 6, T7, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6]);
1247 let ir8 = take_or_place!(data, 7, T8, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7]);
1248 let ir9 = take_or_place!(data, 8, T9, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8]);
1249 let ir10 = take_or_place!(data, 9, T10, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8], [8, ir9]);
1250 let ir11 = take_or_place!(data, 10, T11, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8], [8, ir9], [9, ir10]);
1251 Ok((ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8, ir9, ir10, ir11))
1252 }
1253}
1254
1255
1256impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> FromValue for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
1257where
1258 T1: FromValue,
1259 T2: FromValue,
1260 T3: FromValue,
1261 T4: FromValue,
1262 T5: FromValue,
1263 T6: FromValue,
1264 T7: FromValue,
1265 T8: FromValue,
1266 T9: FromValue,
1267 T10: FromValue,
1268 T11: FromValue,
1269 T12: FromValue,
1270{
1271 fn from_value_opt(data: &Value) -> Result<Self, AkitaDataError> {
1272 if data.get_obj_len() !=12 {
1273 return Err(AkitaDataError::NoSuchValueError(format!("Can not convert row with {:?}", data)))
1274 }
1275 let ir1 = take_or_place!(data, 0, T1);
1276 let ir2 = take_or_place!(data, 1, T2, [0, ir1]);
1277 let ir3 = take_or_place!(data, 2, T3, [0, ir1], [1, ir2]);
1278 let ir4 = take_or_place!(data, 3, T4, [0, ir1], [1, ir2], [2, ir3]);
1279 let ir5 = take_or_place!(data, 4, T5, [0, ir1], [1, ir2], [2, ir3], [3, ir4]);
1280 let ir6 = take_or_place!(data, 5, T6, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5]);
1281 let ir7 = take_or_place!(data, 6, T7, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6]);
1282 let ir8 = take_or_place!(data, 7, T8, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7]);
1283 let ir9 = take_or_place!(data, 8, T9, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8]);
1284 let ir10 = take_or_place!(data, 9, T10, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8], [8, ir9]);
1285 let ir11 = take_or_place!(data, 10, T11, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8], [8, ir9], [9, ir10]);
1286 let ir12 = take_or_place!(data, 11, T12, [0, ir1], [1, ir2], [2, ir3], [3, ir4], [4, ir5], [5, ir6], [6, ir7], [7, ir8], [8, ir9], [9, ir10], [10, ir11]);
1287 Ok((ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8, ir9, ir10, ir11, ir12))
1288 }
1289}
1290
1291impl <V> ToValue for IndexMap<String, V> where V: ToValue {
1292 fn to_value(&self) -> Value {
1293 let mut map: IndexMap<String, Value> = IndexMap::new();
1294 for key in self.keys() {
1295 if let Some(v) = self.get(key) {
1296 map.insert(key.to_string(), V::to_value(v));
1297 }
1298 }
1299 Value::Object(map)
1300
1301 }
1302}
1303
1304#[inline]
1306pub fn from_value<T: FromValue>(v: Value) -> T {
1307 FromValue::from_value(&v)
1308}
1309
1310#[inline]
1312pub fn from_value_opt<T: FromValue>(v: Value) -> Result<T, AkitaDataError> {
1313 FromValue::from_value_opt(&v)
1314}
1315
1316
1317
1318#[test]
1319fn test_serialize() {
1320 use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc};
1321 let mut v: Value = Value::Object(IndexMap::new());
1322 v.insert_obj("k", "v");
1323 let serialize = serde_json::to_string(&v).unwrap();
1324 println!("serialize: {}", serialize);
1325 let deserials = serde_json::from_str::<Value>(&serialize).unwrap();
1326 println!("derialize: {:?}", v);
1327
1328}