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
use itertools::Itertools;
use std::collections::HashMap;
use std::io::Cursor;
use crate::frame::Serialize;
use crate::types::serialize_str;
use crate::types::value::Value;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum QueryValues {
SimpleValues(Vec<Value>),
NamedValues(HashMap<String, Value>),
}
impl QueryValues {
#[inline]
pub fn has_names(&self) -> bool {
!matches!(*self, QueryValues::SimpleValues(_))
}
pub fn len(&self) -> usize {
match *self {
QueryValues::SimpleValues(ref v) => v.len(),
QueryValues::NamedValues(ref m) => m.len(),
}
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<T: Into<Value>> From<Vec<T>> for QueryValues {
fn from(values: Vec<T>) -> QueryValues {
let vals = values.into_iter().map_into();
QueryValues::SimpleValues(vals.collect())
}
}
impl<T: Into<Value> + Clone> From<&[T]> for QueryValues {
fn from(values: &[T]) -> QueryValues {
let values = values.iter().map(|v| v.clone().into());
QueryValues::SimpleValues(values.collect())
}
}
impl<S: ToString, V: Into<Value>> From<HashMap<S, V>> for QueryValues {
fn from(values: HashMap<S, V>) -> QueryValues {
let mut map = HashMap::with_capacity(values.len());
for (name, val) in values {
map.insert(name.to_string(), val.into());
}
QueryValues::NamedValues(map)
}
}
impl Serialize for QueryValues {
fn serialize(&self, cursor: &mut Cursor<&mut Vec<u8>>) {
match self {
QueryValues::SimpleValues(v) => {
for value in v {
value.serialize(cursor);
}
}
QueryValues::NamedValues(v) => {
for (key, value) in v {
serialize_str(cursor, key);
value.serialize(cursor);
}
}
}
}
}