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