cassandra_protocol/types/
udt.rs

1use std::collections::HashMap;
2use std::net::IpAddr;
3use std::num::{NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8};
4
5use chrono::prelude::*;
6use time::PrimitiveDateTime;
7use uuid::Uuid;
8
9use crate::error::{column_is_empty_err, Error, Result};
10use crate::frame::message_result::{CUdt, ColType, ColTypeOption, ColTypeOptionValue};
11use crate::frame::Version;
12use crate::types::blob::Blob;
13use crate::types::data_serialization_types::*;
14use crate::types::decimal::Decimal;
15use crate::types::list::List;
16use crate::types::map::Map;
17use crate::types::tuple::Tuple;
18use crate::types::{ByName, CBytes, IntoRustByName};
19use num_bigint::BigInt;
20
21#[derive(Clone, Debug)]
22pub struct Udt {
23    data: HashMap<String, (ColTypeOption, CBytes)>,
24    protocol_version: Version,
25}
26
27impl Udt {
28    pub fn new(fields: Vec<CBytes>, metadata: &CUdt, protocol_version: Version) -> Udt {
29        let mut data: HashMap<String, (ColTypeOption, CBytes)> =
30            HashMap::with_capacity(metadata.descriptions.len());
31
32        for ((name, val_type), val_b) in metadata.descriptions.iter().zip(fields.into_iter()) {
33            data.insert(name.clone(), (val_type.clone(), val_b));
34        }
35        Udt {
36            data,
37            protocol_version,
38        }
39    }
40}
41
42impl ByName for Udt {}
43
44into_rust_by_name!(Udt, Blob);
45into_rust_by_name!(Udt, String);
46into_rust_by_name!(Udt, bool);
47into_rust_by_name!(Udt, i64);
48into_rust_by_name!(Udt, i32);
49into_rust_by_name!(Udt, i16);
50into_rust_by_name!(Udt, i8);
51into_rust_by_name!(Udt, f64);
52into_rust_by_name!(Udt, f32);
53into_rust_by_name!(Udt, IpAddr);
54into_rust_by_name!(Udt, Uuid);
55into_rust_by_name!(Udt, List);
56into_rust_by_name!(Udt, Map);
57into_rust_by_name!(Udt, Udt);
58into_rust_by_name!(Udt, Tuple);
59into_rust_by_name!(Udt, PrimitiveDateTime);
60into_rust_by_name!(Udt, Decimal);
61into_rust_by_name!(Udt, NonZeroI8);
62into_rust_by_name!(Udt, NonZeroI16);
63into_rust_by_name!(Udt, NonZeroI32);
64into_rust_by_name!(Udt, NonZeroI64);
65into_rust_by_name!(Udt, NaiveDateTime);
66into_rust_by_name!(Udt, DateTime<Utc>);
67into_rust_by_name!(Udt, BigInt);
68
69udt_as_cassandra_type!();