@@ -3,6 +3,10 @@ use numeric::PgNumeric;
33use std:: fmt:: Debug ;
44use uuid:: Uuid ;
55
6+ use crate :: bail;
7+ use crate :: error:: ErrorKind ;
8+ use crate :: error:: EtlError ;
9+
610pub mod bool;
711pub mod event;
812pub mod hex;
@@ -103,3 +107,172 @@ impl ArrayCell {
103107 }
104108 }
105109}
110+
111+ #[ derive( Debug , Clone , PartialEq ) ]
112+ pub enum CellNonOptional {
113+ Null ,
114+ Bool ( bool ) ,
115+ String ( String ) ,
116+ I16 ( i16 ) ,
117+ I32 ( i32 ) ,
118+ U32 ( u32 ) ,
119+ I64 ( i64 ) ,
120+ F32 ( f32 ) ,
121+ F64 ( f64 ) ,
122+ Numeric ( PgNumeric ) ,
123+ Date ( NaiveDate ) ,
124+ Time ( NaiveTime ) ,
125+ TimeStamp ( NaiveDateTime ) ,
126+ TimeStampTz ( DateTime < Utc > ) ,
127+ Uuid ( Uuid ) ,
128+ Json ( serde_json:: Value ) ,
129+ Bytes ( Vec < u8 > ) ,
130+ Array ( ArrayCellNonOptional ) ,
131+ }
132+
133+ impl TryFrom < Cell > for CellNonOptional {
134+ type Error = EtlError ;
135+
136+ fn try_from ( cell : Cell ) -> Result < Self , Self :: Error > {
137+ match cell {
138+ Cell :: Null => Ok ( CellNonOptional :: Null ) ,
139+ Cell :: Bool ( val) => Ok ( CellNonOptional :: Bool ( val) ) ,
140+ Cell :: String ( val) => Ok ( CellNonOptional :: String ( val) ) ,
141+ Cell :: I16 ( val) => Ok ( CellNonOptional :: I16 ( val) ) ,
142+ Cell :: I32 ( val) => Ok ( CellNonOptional :: I32 ( val) ) ,
143+ Cell :: U32 ( val) => Ok ( CellNonOptional :: U32 ( val) ) ,
144+ Cell :: I64 ( val) => Ok ( CellNonOptional :: I64 ( val) ) ,
145+ Cell :: F32 ( val) => Ok ( CellNonOptional :: F32 ( val) ) ,
146+ Cell :: F64 ( val) => Ok ( CellNonOptional :: F64 ( val) ) ,
147+ Cell :: Numeric ( val) => Ok ( CellNonOptional :: Numeric ( val) ) ,
148+ Cell :: Date ( val) => Ok ( CellNonOptional :: Date ( val) ) ,
149+ Cell :: Time ( val) => Ok ( CellNonOptional :: Time ( val) ) ,
150+ Cell :: TimeStamp ( val) => Ok ( CellNonOptional :: TimeStamp ( val) ) ,
151+ Cell :: TimeStampTz ( val) => Ok ( CellNonOptional :: TimeStampTz ( val) ) ,
152+ Cell :: Uuid ( val) => Ok ( CellNonOptional :: Uuid ( val) ) ,
153+ Cell :: Json ( val) => Ok ( CellNonOptional :: Json ( val) ) ,
154+ Cell :: Bytes ( val) => Ok ( CellNonOptional :: Bytes ( val) ) ,
155+ Cell :: Array ( array_cell) => {
156+ let array_cell_non_optional = ArrayCellNonOptional :: try_from ( array_cell) ?;
157+ Ok ( CellNonOptional :: Array ( array_cell_non_optional) )
158+ }
159+ }
160+ }
161+ }
162+
163+ impl CellNonOptional {
164+ pub fn clear ( & mut self ) {
165+ match self {
166+ CellNonOptional :: Null => { }
167+ CellNonOptional :: Bool ( b) => * b = false ,
168+ CellNonOptional :: String ( s) => s. clear ( ) ,
169+ CellNonOptional :: I16 ( i) => * i = 0 ,
170+ CellNonOptional :: I32 ( i) => * i = 0 ,
171+ CellNonOptional :: I64 ( i) => * i = 0 ,
172+ CellNonOptional :: F32 ( i) => * i = 0. ,
173+ CellNonOptional :: F64 ( i) => * i = 0. ,
174+ CellNonOptional :: Numeric ( n) => * n = PgNumeric :: default ( ) ,
175+ CellNonOptional :: Date ( t) => * t = NaiveDate :: default ( ) ,
176+ CellNonOptional :: Time ( t) => * t = NaiveTime :: default ( ) ,
177+ CellNonOptional :: TimeStamp ( t) => * t = NaiveDateTime :: default ( ) ,
178+ CellNonOptional :: TimeStampTz ( t) => * t = DateTime :: < Utc > :: default ( ) ,
179+ CellNonOptional :: Uuid ( u) => * u = Uuid :: default ( ) ,
180+ CellNonOptional :: Json ( j) => * j = serde_json:: Value :: default ( ) ,
181+ CellNonOptional :: U32 ( u) => * u = 0 ,
182+ CellNonOptional :: Bytes ( b) => b. clear ( ) ,
183+ CellNonOptional :: Array ( vec) => {
184+ vec. clear ( ) ;
185+ }
186+ }
187+ }
188+ }
189+
190+ #[ derive( Debug , Clone , PartialEq ) ]
191+ pub enum ArrayCellNonOptional {
192+ Null ,
193+ Bool ( Vec < bool > ) ,
194+ String ( Vec < String > ) ,
195+ I16 ( Vec < i16 > ) ,
196+ I32 ( Vec < i32 > ) ,
197+ U32 ( Vec < u32 > ) ,
198+ I64 ( Vec < i64 > ) ,
199+ F32 ( Vec < f32 > ) ,
200+ F64 ( Vec < f64 > ) ,
201+ Numeric ( Vec < PgNumeric > ) ,
202+ Date ( Vec < NaiveDate > ) ,
203+ Time ( Vec < NaiveTime > ) ,
204+ TimeStamp ( Vec < NaiveDateTime > ) ,
205+ TimeStampTz ( Vec < DateTime < Utc > > ) ,
206+ Uuid ( Vec < Uuid > ) ,
207+ Json ( Vec < serde_json:: Value > ) ,
208+ Bytes ( Vec < Vec < u8 > > ) ,
209+ }
210+
211+ macro_rules! convert_array_variant {
212+ ( $variant: ident, $vec: expr) => {
213+ if $vec. iter( ) . any( |v| v. is_none( ) ) {
214+ bail!(
215+ ErrorKind :: NullValuesNotSupportedInArray ,
216+ "NULL values in arrays are not supported" ,
217+ format!(
218+ "Remove the NULL values from the array {:?} and try again" ,
219+ $vec
220+ )
221+ )
222+ } else {
223+ Ok ( ArrayCellNonOptional :: $variant(
224+ $vec. into_iter( ) . flatten( ) . collect( ) ,
225+ ) )
226+ }
227+ } ;
228+ }
229+
230+ impl TryFrom < ArrayCell > for ArrayCellNonOptional {
231+ type Error = EtlError ;
232+
233+ fn try_from ( array_cell : ArrayCell ) -> Result < Self , Self :: Error > {
234+ match array_cell {
235+ ArrayCell :: Null => Ok ( ArrayCellNonOptional :: Null ) ,
236+ ArrayCell :: Bool ( vec) => convert_array_variant ! ( Bool , vec) ,
237+ ArrayCell :: String ( vec) => convert_array_variant ! ( String , vec) ,
238+ ArrayCell :: I16 ( vec) => convert_array_variant ! ( I16 , vec) ,
239+ ArrayCell :: I32 ( vec) => convert_array_variant ! ( I32 , vec) ,
240+ ArrayCell :: U32 ( vec) => convert_array_variant ! ( U32 , vec) ,
241+ ArrayCell :: I64 ( vec) => convert_array_variant ! ( I64 , vec) ,
242+ ArrayCell :: F32 ( vec) => convert_array_variant ! ( F32 , vec) ,
243+ ArrayCell :: F64 ( vec) => convert_array_variant ! ( F64 , vec) ,
244+ ArrayCell :: Numeric ( vec) => convert_array_variant ! ( Numeric , vec) ,
245+ ArrayCell :: Date ( vec) => convert_array_variant ! ( Date , vec) ,
246+ ArrayCell :: Time ( vec) => convert_array_variant ! ( Time , vec) ,
247+ ArrayCell :: TimeStamp ( vec) => convert_array_variant ! ( TimeStamp , vec) ,
248+ ArrayCell :: TimeStampTz ( vec) => convert_array_variant ! ( TimeStampTz , vec) ,
249+ ArrayCell :: Uuid ( vec) => convert_array_variant ! ( Uuid , vec) ,
250+ ArrayCell :: Json ( vec) => convert_array_variant ! ( Json , vec) ,
251+ ArrayCell :: Bytes ( vec) => convert_array_variant ! ( Bytes , vec) ,
252+ }
253+ }
254+ }
255+
256+ impl ArrayCellNonOptional {
257+ fn clear ( & mut self ) {
258+ match self {
259+ ArrayCellNonOptional :: Null => { }
260+ ArrayCellNonOptional :: Bool ( vec) => vec. clear ( ) ,
261+ ArrayCellNonOptional :: String ( vec) => vec. clear ( ) ,
262+ ArrayCellNonOptional :: I16 ( vec) => vec. clear ( ) ,
263+ ArrayCellNonOptional :: I32 ( vec) => vec. clear ( ) ,
264+ ArrayCellNonOptional :: U32 ( vec) => vec. clear ( ) ,
265+ ArrayCellNonOptional :: I64 ( vec) => vec. clear ( ) ,
266+ ArrayCellNonOptional :: F32 ( vec) => vec. clear ( ) ,
267+ ArrayCellNonOptional :: F64 ( vec) => vec. clear ( ) ,
268+ ArrayCellNonOptional :: Numeric ( vec) => vec. clear ( ) ,
269+ ArrayCellNonOptional :: Date ( vec) => vec. clear ( ) ,
270+ ArrayCellNonOptional :: Time ( vec) => vec. clear ( ) ,
271+ ArrayCellNonOptional :: TimeStamp ( vec) => vec. clear ( ) ,
272+ ArrayCellNonOptional :: TimeStampTz ( vec) => vec. clear ( ) ,
273+ ArrayCellNonOptional :: Uuid ( vec) => vec. clear ( ) ,
274+ ArrayCellNonOptional :: Json ( vec) => vec. clear ( ) ,
275+ ArrayCellNonOptional :: Bytes ( vec) => vec. clear ( ) ,
276+ }
277+ }
278+ }
0 commit comments