snowflake_deserializer/
bindings.rs

1use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
2
3#[derive(Clone, Debug)]
4pub enum BindingValue {
5    Bool(bool),
6
7    Byte(i8),
8    SmallInt(i16),
9    Int(i32),
10    BigInt(i64),
11    ISize(isize),
12
13    UByte(u8),
14    SmallUInt(u16),
15    UInt(u32),
16    BigUInt(u64),
17    USize(usize),
18
19    Float(f32),
20    Double(f64),
21    #[cfg(feature = "decimal")]
22    Decimal(rust_decimal::Decimal),
23
24    Char(char),
25    String(String),
26
27    DateTime(NaiveDateTime),
28    Date(NaiveDate),
29    Time(NaiveTime),
30}
31
32#[derive(Clone, Debug)]
33pub enum BindingType {
34    Bool,
35    Fixed,
36    Real,
37    Text,
38    DateTime,
39    Date,
40    Time,
41}
42
43impl ToString for BindingType {
44    fn to_string(&self) -> String {
45        match self {
46            BindingType::Bool => "BOOLEAN",
47            BindingType::Fixed => "FIXED",
48            BindingType::Real => "REAL",
49            BindingType::Text => "TEXT",
50            BindingType::DateTime => "TIMESTAMP_NTZ",
51            BindingType::Date => "DATE",
52            BindingType::Time => "TIME",
53        }
54        .into()
55    }
56}
57
58impl From<BindingValue> for BindingType {
59    fn from(value: BindingValue) -> Self {
60        match value {
61            BindingValue::Bool(_) => BindingType::Bool,
62            BindingValue::Byte(_)
63            | BindingValue::SmallInt(_)
64            | BindingValue::Int(_)
65            | BindingValue::BigInt(_)
66            | BindingValue::ISize(_)
67            | BindingValue::UByte(_)
68            | BindingValue::SmallUInt(_)
69            | BindingValue::UInt(_)
70            | BindingValue::BigUInt(_)
71            | BindingValue::USize(_) => BindingType::Fixed,
72            BindingValue::Float(_) | BindingValue::Double(_) => BindingType::Real,
73            #[cfg(feature = "decimal")]
74            BindingValue::Decimal(_) => BindingType::Real,
75            BindingValue::Char(_) | BindingValue::String(_) => BindingType::Text,
76            BindingValue::DateTime(_) => BindingType::DateTime,
77            BindingValue::Date(_) => BindingType::Date,
78            BindingValue::Time(_) => BindingType::Time,
79        }
80    }
81}
82
83impl ToString for BindingValue {
84    fn to_string(&self) -> String {
85        match self {
86            BindingValue::Bool(value) => value.to_string(),
87            BindingValue::Byte(value) => value.to_string(),
88            BindingValue::SmallInt(value) => value.to_string(),
89            BindingValue::Int(value) => value.to_string(),
90            BindingValue::BigInt(value) => value.to_string(),
91            BindingValue::ISize(value) => value.to_string(),
92            BindingValue::UByte(value) => value.to_string(),
93            BindingValue::SmallUInt(value) => value.to_string(),
94            BindingValue::UInt(value) => value.to_string(),
95            BindingValue::BigUInt(value) => value.to_string(),
96            BindingValue::USize(value) => value.to_string(),
97            BindingValue::Float(value) => value.to_string(),
98            BindingValue::Double(value) => value.to_string(),
99            #[cfg(feature = "decimal")]
100            BindingValue::Decimal(value) => value.to_string(),
101            BindingValue::Char(value) => value.to_string(),
102            BindingValue::String(value) => value.to_string(),
103            BindingValue::DateTime(value) => {
104                value.and_utc().timestamp_nanos_opt().unwrap().to_string()
105            }
106            BindingValue::Date(value) => value
107                .and_time(NaiveTime::default())
108                .and_utc()
109                .timestamp_millis()
110                .to_string(),
111            BindingValue::Time(value) => (NaiveDate::default()
112                .and_time(*value)
113                .and_utc()
114                .timestamp_nanos_opt()
115                .unwrap() as f64
116                / 60.0)
117                .to_string(),
118        }
119    }
120}
121
122impl From<&str> for BindingValue {
123    fn from(value: &str) -> Self {
124        BindingValue::String(value.to_owned())
125    }
126}
127
128macro_rules! impl_from_binding_value {
129    ($ty: ty, $ex: expr) => {
130        impl ::std::convert::From<$ty> for BindingValue {
131            fn from(value: $ty) -> Self {
132                $ex(value)
133            }
134        }
135    };
136}
137impl_from_binding_value!(bool, BindingValue::Bool);
138impl_from_binding_value!(i8, BindingValue::Byte);
139impl_from_binding_value!(i16, BindingValue::SmallInt);
140impl_from_binding_value!(i32, BindingValue::Int);
141impl_from_binding_value!(i64, BindingValue::BigInt);
142impl_from_binding_value!(isize, BindingValue::ISize);
143impl_from_binding_value!(u8, BindingValue::UByte);
144impl_from_binding_value!(u16, BindingValue::SmallUInt);
145impl_from_binding_value!(u32, BindingValue::UInt);
146impl_from_binding_value!(u64, BindingValue::BigUInt);
147impl_from_binding_value!(usize, BindingValue::USize);
148impl_from_binding_value!(f32, BindingValue::Float);
149impl_from_binding_value!(f64, BindingValue::Double);
150#[cfg(feature = "decimal")]
151impl_from_binding_value!(rust_decimal::Decimal, BindingValue::Decimal);
152impl_from_binding_value!(char, BindingValue::Char);
153impl_from_binding_value!(String, BindingValue::String);
154impl_from_binding_value!(NaiveDateTime, BindingValue::DateTime);
155impl_from_binding_value!(NaiveDate, BindingValue::Date);
156impl_from_binding_value!(NaiveTime, BindingValue::Time);