1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use bson::Bson;
use serde::de::DeserializeOwned;
use crate::{Error};
use crate::types::Format;
pub fn decode<T: ?Sized>(mut datas: Vec<Bson>) -> Result<T, crate::Error>
where
T: DeserializeOwned,
{
let mut js = Bson::Null;
let mut type_name = std::any::type_name::<T>();
#[cfg(feature = "debug_mode")]
println!("[rbatis] [debug_mode] => {}", datas.do_format());
let is_array: Result<T, bson::de::Error> = bson::from_bson(bson::Bson::Array(vec![]));
if is_array.is_ok() {
js = Bson::Array(datas);
return Ok(bson::from_bson(js)?);
} else {
if datas.len() > 1 {
return Result::Err(Error::from(format!("[rbatis] rows.rows_affected > 1,but decode one type ({})!", type_name)));
}
if datas.is_empty() {
return Ok(bson::from_bson::<T>(Bson::Null)?);
}
let mut v = None;
let m = datas.remove(0);
match &m {
Bson::Document(d) => {
if d.len() == 1 {
for (k, _v) in d {
v = Some(_v.clone());
break;
}
}
}
_ => {}
}
let r = bson::from_bson::<T>(m);
if r.is_err() {
let v = v.take().unwrap_or_default();
return Ok(bson::from_bson::<T>(v)?);
} else {
return Ok(r.unwrap());
}
}
}
#[cfg(test)]
mod test {
use std::collections::{BTreeMap, HashMap, HashSet, VecDeque};
use bson::Bson;
use bson::bson;
use crate::decode::{decode};
use crate::types::Json;
#[test]
fn test_decode_hashmap() {
let m: HashMap<String, Bson> = decode(vec![bson!(
{
"a":"1",
"b":2
}
)])
.unwrap();
println!("{:#?}", m);
}
#[test]
fn test_decode_btree_map() {
let m: BTreeMap<String, Bson> = decode(vec![bson!(
{
"a":"1",
"b":2
}
)])
.unwrap();
println!("{:#?}", m);
}
}