snowflake_deserializer/
bindings.rs1use 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);