cassandra_protocol/types/
tuple.rs

1use chrono::prelude::*;
2use num_bigint::BigInt;
3use std::hash::{Hash, Hasher};
4use std::net::IpAddr;
5use time::PrimitiveDateTime;
6use uuid::Uuid;
7
8use crate::error::{column_is_empty_err, Error, Result};
9use crate::frame::message_result::{CTuple, ColType, ColTypeOption, ColTypeOptionValue};
10use crate::frame::Version;
11use crate::types::blob::Blob;
12use crate::types::data_serialization_types::*;
13use crate::types::decimal::Decimal;
14use crate::types::list::List;
15use crate::types::map::Map;
16use crate::types::udt::Udt;
17use crate::types::{ByIndex, CBytes, IntoRustByIndex};
18
19#[derive(Debug)]
20pub struct Tuple {
21    data: Vec<(ColTypeOption, CBytes)>,
22    protocol_version: Version,
23}
24
25impl PartialEq for Tuple {
26    fn eq(&self, other: &Tuple) -> bool {
27        if self.data.len() != other.data.len() {
28            return false;
29        }
30        for (s, o) in self.data.iter().zip(other.data.iter()) {
31            if s.1 != o.1 {
32                return false;
33            }
34        }
35        true
36    }
37}
38
39impl Eq for Tuple {}
40
41impl Hash for Tuple {
42    fn hash<H: Hasher>(&self, state: &mut H) {
43        for data in &self.data {
44            data.1.hash(state);
45        }
46    }
47}
48
49impl Tuple {
50    pub fn new(elements: Vec<CBytes>, metadata: &CTuple, protocol_version: Version) -> Tuple {
51        Tuple {
52            data: metadata
53                .types
54                .iter()
55                .zip(elements)
56                .map(|(val_type, val_b)| (val_type.clone(), val_b))
57                .collect(),
58            protocol_version,
59        }
60    }
61}
62
63impl ByIndex for Tuple {}
64
65into_rust_by_index!(Tuple, Blob);
66into_rust_by_index!(Tuple, String);
67into_rust_by_index!(Tuple, bool);
68into_rust_by_index!(Tuple, i64);
69into_rust_by_index!(Tuple, i32);
70into_rust_by_index!(Tuple, i16);
71into_rust_by_index!(Tuple, i8);
72into_rust_by_index!(Tuple, f64);
73into_rust_by_index!(Tuple, f32);
74into_rust_by_index!(Tuple, IpAddr);
75into_rust_by_index!(Tuple, Uuid);
76into_rust_by_index!(Tuple, List);
77into_rust_by_index!(Tuple, Map);
78into_rust_by_index!(Tuple, Udt);
79into_rust_by_index!(Tuple, Tuple);
80into_rust_by_index!(Tuple, PrimitiveDateTime);
81into_rust_by_index!(Tuple, Decimal);
82into_rust_by_index!(Tuple, NaiveDateTime);
83into_rust_by_index!(Tuple, DateTime<Utc>);
84into_rust_by_index!(Tuple, BigInt);
85
86tuple_as_cassandra_type!();