1use serde::{Deserialize, Serialize};
5
6use crate::{
7 Date, DateTime, Decimal, Duration, Int, Time, Type, Uint, Uuid4, Uuid7, Value,
8 value::container::{
9 AnyContainer, BlobContainer, BoolContainer, IdentityIdContainer, NumberContainer, RowNumberContainer,
10 TemporalContainer, UndefinedContainer, Utf8Container, UuidContainer,
11 },
12};
13
14#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
15pub enum FrameColumnData {
16 Bool(BoolContainer),
17 Float4(NumberContainer<f32>),
18 Float8(NumberContainer<f64>),
19 Int1(NumberContainer<i8>),
20 Int2(NumberContainer<i16>),
21 Int4(NumberContainer<i32>),
22 Int8(NumberContainer<i64>),
23 Int16(NumberContainer<i128>),
24 Uint1(NumberContainer<u8>),
25 Uint2(NumberContainer<u16>),
26 Uint4(NumberContainer<u32>),
27 Uint8(NumberContainer<u64>),
28 Uint16(NumberContainer<u128>),
29 Utf8(Utf8Container),
30 Date(TemporalContainer<Date>),
31 DateTime(TemporalContainer<DateTime>),
32 Time(TemporalContainer<Time>),
33 Duration(TemporalContainer<Duration>),
34 RowNumber(RowNumberContainer),
35 IdentityId(IdentityIdContainer),
36 Uuid4(UuidContainer<Uuid4>),
37 Uuid7(UuidContainer<Uuid7>),
38 Blob(BlobContainer),
39 Int(NumberContainer<Int>),
40 Uint(NumberContainer<Uint>),
41 Decimal(NumberContainer<Decimal>),
42 Any(AnyContainer),
43 Undefined(UndefinedContainer),
45}
46
47impl FrameColumnData {
48 pub fn get_type(&self) -> Type {
49 match self {
50 FrameColumnData::Bool(_) => Type::Boolean,
51 FrameColumnData::Float4(_) => Type::Float4,
52 FrameColumnData::Float8(_) => Type::Float8,
53 FrameColumnData::Int1(_) => Type::Int1,
54 FrameColumnData::Int2(_) => Type::Int2,
55 FrameColumnData::Int4(_) => Type::Int4,
56 FrameColumnData::Int8(_) => Type::Int8,
57 FrameColumnData::Int16(_) => Type::Int16,
58 FrameColumnData::Uint1(_) => Type::Uint1,
59 FrameColumnData::Uint2(_) => Type::Uint2,
60 FrameColumnData::Uint4(_) => Type::Uint4,
61 FrameColumnData::Uint8(_) => Type::Uint8,
62 FrameColumnData::Uint16(_) => Type::Uint16,
63 FrameColumnData::Utf8(_) => Type::Utf8,
64 FrameColumnData::Date(_) => Type::Date,
65 FrameColumnData::DateTime(_) => Type::DateTime,
66 FrameColumnData::Time(_) => Type::Time,
67 FrameColumnData::Duration(_) => Type::Duration,
68 FrameColumnData::RowNumber(_) => Type::RowNumber,
69 FrameColumnData::IdentityId(_) => Type::IdentityId,
70 FrameColumnData::Uuid4(_) => Type::Uuid4,
71 FrameColumnData::Uuid7(_) => Type::Uuid7,
72 FrameColumnData::Blob(_) => Type::Blob,
73 FrameColumnData::Int(_) => Type::Int,
74 FrameColumnData::Uint(_) => Type::Uint,
75 FrameColumnData::Decimal(_) => Type::Decimal,
76 FrameColumnData::Any(_) => Type::Any,
77 FrameColumnData::Undefined(_) => Type::Undefined,
78 }
79 }
80
81 pub fn is_defined(&self, idx: usize) -> bool {
82 match self {
83 FrameColumnData::Bool(container) => container.is_defined(idx),
84 FrameColumnData::Float4(container) => container.is_defined(idx),
85 FrameColumnData::Float8(container) => container.is_defined(idx),
86 FrameColumnData::Int1(container) => container.is_defined(idx),
87 FrameColumnData::Int2(container) => container.is_defined(idx),
88 FrameColumnData::Int4(container) => container.is_defined(idx),
89 FrameColumnData::Int8(container) => container.is_defined(idx),
90 FrameColumnData::Int16(container) => container.is_defined(idx),
91 FrameColumnData::Uint1(container) => container.is_defined(idx),
92 FrameColumnData::Uint2(container) => container.is_defined(idx),
93 FrameColumnData::Uint4(container) => container.is_defined(idx),
94 FrameColumnData::Uint8(container) => container.is_defined(idx),
95 FrameColumnData::Uint16(container) => container.is_defined(idx),
96 FrameColumnData::Utf8(container) => container.is_defined(idx),
97 FrameColumnData::Date(container) => container.is_defined(idx),
98 FrameColumnData::DateTime(container) => container.is_defined(idx),
99 FrameColumnData::Time(container) => container.is_defined(idx),
100 FrameColumnData::Duration(container) => container.is_defined(idx),
101 FrameColumnData::RowNumber(container) => container.is_defined(idx),
102 FrameColumnData::IdentityId(container) => container.is_defined(idx),
103 FrameColumnData::Uuid4(container) => container.is_defined(idx),
104 FrameColumnData::Uuid7(container) => container.is_defined(idx),
105 FrameColumnData::Blob(container) => container.is_defined(idx),
106 FrameColumnData::Int(container) => container.is_defined(idx),
107 FrameColumnData::Uint(container) => container.is_defined(idx),
108 FrameColumnData::Decimal(container) => container.is_defined(idx),
109 FrameColumnData::Any(container) => container.is_defined(idx),
110 FrameColumnData::Undefined(_) => false,
111 }
112 }
113
114 pub fn is_bool(&self) -> bool {
115 self.get_type() == Type::Boolean
116 }
117
118 pub fn is_float(&self) -> bool {
119 self.get_type() == Type::Float4 || self.get_type() == Type::Float8
120 }
121
122 pub fn is_utf8(&self) -> bool {
123 self.get_type() == Type::Utf8
124 }
125
126 pub fn is_number(&self) -> bool {
127 matches!(
128 self.get_type(),
129 Type::Float4
130 | Type::Float8 | Type::Int1 | Type::Int2
131 | Type::Int4 | Type::Int8 | Type::Int16
132 | Type::Uint1 | Type::Uint2 | Type::Uint4
133 | Type::Uint8 | Type::Uint16
134 )
135 }
136
137 pub fn is_text(&self) -> bool {
138 self.get_type() == Type::Utf8
139 }
140
141 pub fn is_temporal(&self) -> bool {
142 matches!(self.get_type(), Type::Date | Type::DateTime | Type::Time | Type::Duration)
143 }
144
145 pub fn is_uuid(&self) -> bool {
146 matches!(self.get_type(), Type::Uuid4 | Type::Uuid7)
147 }
148
149 pub fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = Value> + 'a> {
150 Box::new((0..self.len()).map(move |i| self.get_value(i)))
151 }
152}
153
154impl FrameColumnData {
155 pub fn len(&self) -> usize {
156 match self {
157 FrameColumnData::Bool(container) => container.len(),
158 FrameColumnData::Float4(container) => container.len(),
159 FrameColumnData::Float8(container) => container.len(),
160 FrameColumnData::Int1(container) => container.len(),
161 FrameColumnData::Int2(container) => container.len(),
162 FrameColumnData::Int4(container) => container.len(),
163 FrameColumnData::Int8(container) => container.len(),
164 FrameColumnData::Int16(container) => container.len(),
165 FrameColumnData::Uint1(container) => container.len(),
166 FrameColumnData::Uint2(container) => container.len(),
167 FrameColumnData::Uint4(container) => container.len(),
168 FrameColumnData::Uint8(container) => container.len(),
169 FrameColumnData::Uint16(container) => container.len(),
170 FrameColumnData::Utf8(container) => container.len(),
171 FrameColumnData::Date(container) => container.len(),
172 FrameColumnData::DateTime(container) => container.len(),
173 FrameColumnData::Time(container) => container.len(),
174 FrameColumnData::Duration(container) => container.len(),
175 FrameColumnData::RowNumber(container) => container.len(),
176 FrameColumnData::IdentityId(container) => container.len(),
177 FrameColumnData::Uuid4(container) => container.len(),
178 FrameColumnData::Uuid7(container) => container.len(),
179 FrameColumnData::Blob(container) => container.len(),
180 FrameColumnData::Int(container) => container.len(),
181 FrameColumnData::Uint(container) => container.len(),
182 FrameColumnData::Decimal(container) => container.len(),
183 FrameColumnData::Any(container) => container.len(),
184 FrameColumnData::Undefined(container) => container.len(),
185 }
186 }
187
188 pub fn as_string(&self, index: usize) -> String {
189 match self {
190 FrameColumnData::Bool(container) => container.as_string(index),
191 FrameColumnData::Float4(container) => container.as_string(index),
192 FrameColumnData::Float8(container) => container.as_string(index),
193 FrameColumnData::Int1(container) => container.as_string(index),
194 FrameColumnData::Int2(container) => container.as_string(index),
195 FrameColumnData::Int4(container) => container.as_string(index),
196 FrameColumnData::Int8(container) => container.as_string(index),
197 FrameColumnData::Int16(container) => container.as_string(index),
198 FrameColumnData::Uint1(container) => container.as_string(index),
199 FrameColumnData::Uint2(container) => container.as_string(index),
200 FrameColumnData::Uint4(container) => container.as_string(index),
201 FrameColumnData::Uint8(container) => container.as_string(index),
202 FrameColumnData::Uint16(container) => container.as_string(index),
203 FrameColumnData::Utf8(container) => container.as_string(index),
204 FrameColumnData::Date(container) => container.as_string(index),
205 FrameColumnData::DateTime(container) => container.as_string(index),
206 FrameColumnData::Time(container) => container.as_string(index),
207 FrameColumnData::Duration(container) => container.as_string(index),
208 FrameColumnData::RowNumber(container) => container.as_string(index),
209 FrameColumnData::IdentityId(container) => container.as_string(index),
210 FrameColumnData::Uuid4(container) => container.as_string(index),
211 FrameColumnData::Uuid7(container) => container.as_string(index),
212 FrameColumnData::Blob(container) => container.as_string(index),
213 FrameColumnData::Int(container) => container.as_string(index),
214 FrameColumnData::Uint(container) => container.as_string(index),
215 FrameColumnData::Decimal(container) => container.as_string(index),
216 FrameColumnData::Any(container) => container.as_string(index),
217 FrameColumnData::Undefined(container) => container.as_string(index),
218 }
219 }
220}
221
222impl FrameColumnData {
223 pub fn get_value(&self, index: usize) -> Value {
224 match self {
225 FrameColumnData::Bool(container) => container.get_value(index),
226 FrameColumnData::Float4(container) => container.get_value(index),
227 FrameColumnData::Float8(container) => container.get_value(index),
228 FrameColumnData::Int1(container) => container.get_value(index),
229 FrameColumnData::Int2(container) => container.get_value(index),
230 FrameColumnData::Int4(container) => container.get_value(index),
231 FrameColumnData::Int8(container) => container.get_value(index),
232 FrameColumnData::Int16(container) => container.get_value(index),
233 FrameColumnData::Uint1(container) => container.get_value(index),
234 FrameColumnData::Uint2(container) => container.get_value(index),
235 FrameColumnData::Uint4(container) => container.get_value(index),
236 FrameColumnData::Uint8(container) => container.get_value(index),
237 FrameColumnData::Uint16(container) => container.get_value(index),
238 FrameColumnData::Utf8(container) => container.get_value(index),
239 FrameColumnData::Date(container) => container.get_value(index),
240 FrameColumnData::DateTime(container) => container.get_value(index),
241 FrameColumnData::Time(container) => container.get_value(index),
242 FrameColumnData::Duration(container) => container.get_value(index),
243 FrameColumnData::RowNumber(container) => container.get_value(index),
244 FrameColumnData::IdentityId(container) => container.get_value(index),
245 FrameColumnData::Uuid4(container) => container.get_value(index),
246 FrameColumnData::Uuid7(container) => container.get_value(index),
247 FrameColumnData::Blob(container) => container.get_value(index),
248 FrameColumnData::Int(container) => container.get_value(index),
249 FrameColumnData::Uint(container) => container.get_value(index),
250 FrameColumnData::Decimal(container) => container.get_value(index),
251 FrameColumnData::Any(container) => container.get_value(index),
252 FrameColumnData::Undefined(container) => container.get_value(index),
253 }
254 }
255}