cassandra_protocol/query/
query_values.rs

1use itertools::Itertools;
2use std::collections::HashMap;
3use std::io::Cursor;
4
5use crate::frame::{Serialize, Version};
6use crate::types::serialize_str;
7use crate::types::value::Value;
8
9/// Enum that represents two types of query values:
10/// * values without name
11/// * values with names
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub enum QueryValues {
14    SimpleValues(Vec<Value>),
15    NamedValues(HashMap<String, Value>),
16}
17
18impl QueryValues {
19    /// Returns `true` if query values is with names and `false` otherwise.
20    #[inline]
21    pub fn has_names(&self) -> bool {
22        !matches!(*self, QueryValues::SimpleValues(_))
23    }
24
25    /// Returns the number of values.
26    pub fn len(&self) -> usize {
27        match *self {
28            QueryValues::SimpleValues(ref v) => v.len(),
29            QueryValues::NamedValues(ref m) => m.len(),
30        }
31    }
32
33    #[inline]
34    pub fn is_empty(&self) -> bool {
35        self.len() == 0
36    }
37}
38
39impl<T: Into<Value>> From<Vec<T>> for QueryValues {
40    /// Converts values from `Vec` to query values without names `QueryValues::SimpleValues`.
41    fn from(values: Vec<T>) -> QueryValues {
42        let vals = values.into_iter().map_into();
43        QueryValues::SimpleValues(vals.collect())
44    }
45}
46
47impl<T: Into<Value> + Clone> From<&[T]> for QueryValues {
48    /// Converts values from `Vec` to query values without names `QueryValues::SimpleValues`.
49    fn from(values: &[T]) -> QueryValues {
50        let values = values.iter().map(|v| v.clone().into());
51        QueryValues::SimpleValues(values.collect())
52    }
53}
54
55impl<S: ToString, V: Into<Value>> From<HashMap<S, V>> for QueryValues {
56    /// Converts values from `HashMap` to query values with names `QueryValues::NamedValues`.
57    fn from(values: HashMap<S, V>) -> QueryValues {
58        let mut map = HashMap::with_capacity(values.len());
59        for (name, val) in values {
60            map.insert(name.to_string(), val.into());
61        }
62
63        QueryValues::NamedValues(map)
64    }
65}
66
67impl Serialize for QueryValues {
68    fn serialize(&self, cursor: &mut Cursor<&mut Vec<u8>>, version: Version) {
69        match self {
70            QueryValues::SimpleValues(v) => {
71                for value in v {
72                    value.serialize(cursor, version);
73                }
74            }
75            QueryValues::NamedValues(v) => {
76                for (key, value) in v {
77                    serialize_str(cursor, key, version);
78                    value.serialize(cursor, version);
79                }
80            }
81        }
82    }
83}