cassandra_proto/query/
query_params.rs1use crate::consistency::Consistency;
2use crate::types::{to_bigint, to_int, to_short, CBytes};
3use crate::frame::AsByte;
4use crate::frame::IntoBytes;
5use super::query_flags::QueryFlags;
6use super::query_values::QueryValues;
7
8#[derive(Debug, Default)]
10pub struct QueryParams {
11 pub consistency: Consistency,
13 pub flags: Vec<QueryFlags>,
15 pub with_names: Option<bool>,
17 pub values: Option<QueryValues>,
19 pub page_size: Option<i32>,
21 pub paging_state: Option<CBytes>,
23 pub serial_consistency: Option<Consistency>,
25 pub timestamp: Option<i64>,
27}
28
29impl QueryParams {
30 pub fn set_values(&mut self, values: QueryValues) {
32 self.flags.push(QueryFlags::Value);
33 self.values = Some(values);
34 }
35
36 fn flags_as_byte(&self) -> u8 {
37 self.flags.iter().fold(0, |acc, flag| acc | flag.as_byte())
38 }
39
40 #[allow(dead_code)]
41 fn parse_query_flags(byte: u8) -> Vec<QueryFlags> {
42 let mut flags: Vec<QueryFlags> = vec![];
43
44 if QueryFlags::has_value(byte) {
45 flags.push(QueryFlags::Value);
46 }
47 if QueryFlags::has_skip_metadata(byte) {
48 flags.push(QueryFlags::SkipMetadata);
49 }
50 if QueryFlags::has_page_size(byte) {
51 flags.push(QueryFlags::PageSize);
52 }
53 if QueryFlags::has_with_paging_state(byte) {
54 flags.push(QueryFlags::WithPagingState);
55 }
56 if QueryFlags::has_with_serial_consistency(byte) {
57 flags.push(QueryFlags::WithSerialConsistency);
58 }
59 if QueryFlags::has_with_default_timestamp(byte) {
60 flags.push(QueryFlags::WithDefaultTimestamp);
61 }
62 if QueryFlags::has_with_names_for_values(byte) {
63 flags.push(QueryFlags::WithNamesForValues);
64 }
65
66 flags
67 }
68}
69
70impl IntoBytes for QueryParams {
71 fn into_cbytes(&self) -> Vec<u8> {
72 let mut v: Vec<u8> = vec![];
73
74 v.extend_from_slice(self.consistency.into_cbytes().as_slice());
75 v.push(self.flags_as_byte());
76 if QueryFlags::has_value(self.flags_as_byte()) {
77 if let Some(ref values) = self.values {
78 v.extend_from_slice(to_short(values.len() as i16).as_slice());
79 v.extend_from_slice(values.into_cbytes().as_slice());
80 }
81 }
82 if QueryFlags::has_page_size(self.flags_as_byte()) && self.page_size.is_some() {
83 v.extend_from_slice(to_int(self.page_size
85 .clone()
86 .unwrap())
89 .as_slice());
90 }
91 if QueryFlags::has_with_paging_state(self.flags_as_byte()) && self.paging_state.is_some() {
92 v.extend_from_slice(self.paging_state
94 .clone()
95 .unwrap()
98 .into_cbytes()
99 .as_slice());
100 }
101 if QueryFlags::has_with_serial_consistency(self.flags_as_byte())
102 && self.serial_consistency.is_some() {
103 v.extend_from_slice(self.serial_consistency
105 .clone()
106 .unwrap()
109 .into_cbytes()
110 .as_slice());
111 }
112 if QueryFlags::has_with_default_timestamp(self.flags_as_byte()) && self.timestamp.is_some() {
113 v.extend_from_slice(to_bigint(self.timestamp.unwrap()).as_slice());
115 }
116
117 v
118 }
119}