@@ -29,6 +29,7 @@ pub(crate) trait SchemaValidator<R: Row>: Sized {
2929 /// the field order in the struct does not match the column order in the database schema.
3030 fn get_schema_index ( & self , struct_idx : usize ) -> usize ;
3131 fn get_field_name ( & self , struct_idx : usize ) -> Option < & ' static str > ;
32+ fn peek ( & self ) -> Option < SerdeType > ;
3233}
3334
3435pub ( crate ) struct DataTypeValidator < ' cursor , R : Row > {
@@ -189,6 +190,30 @@ impl<'cursor, R: Row> SchemaValidator<R> for DataTypeValidator<'cursor, R> {
189190 self . metadata . get_field_name ( struct_idx)
190191 }
191192
193+ fn peek ( & self ) -> Option < SerdeType > {
194+ match R :: KIND {
195+ RowKind :: Primitive => {
196+ let data_type = & self . metadata . columns [ 0 ] . data_type ;
197+ Some ( data_type. into ( ) )
198+ }
199+ RowKind :: Tuple => Some ( SerdeType :: Tuple ( self . metadata . columns . len ( ) ) . into ( ) ) ,
200+ RowKind :: Vec => {
201+ let data_type = & self . metadata . columns [ 0 ] . data_type ;
202+ match data_type {
203+ DataTypeNode :: Array ( inner_type) => Some ( From :: from ( & * * inner_type) ) ,
204+ _ => panic ! (
205+ "Expected Array type when validating root level sequence, but got {}" ,
206+ self . metadata. columns[ 0 ] . data_type
207+ ) ,
208+ }
209+ }
210+ RowKind :: Struct => {
211+ let current_column = & self . metadata . columns [ self . current_column_idx ] ;
212+ Some ( From :: from ( & current_column. data_type ) )
213+ }
214+ }
215+ }
216+
192217 #[ cold]
193218 fn validate_identifier < T : EnumOrVariantIdentifier > ( & mut self , _value : T ) {
194219 unreachable ! ( )
@@ -402,6 +427,46 @@ impl<'cursor, R: Row> SchemaValidator<R> for Option<InnerDataTypeValidator<'_, '
402427 fn get_field_name ( & self , _struct_idx : usize ) -> Option < & ' static str > {
403428 unreachable ! ( )
404429 }
430+
431+ fn peek ( & self ) -> Option < SerdeType > {
432+ let inner = self . as_ref ( ) ?;
433+ match & inner. kind {
434+ InnerDataTypeValidatorKind :: Map ( kv, state) => match state {
435+ MapValidatorState :: Key => Some ( From :: from ( & * kv[ 0 ] ) ) ,
436+ MapValidatorState :: Value => Some ( From :: from ( & * kv[ 1 ] ) ) ,
437+ } ,
438+ InnerDataTypeValidatorKind :: MapAsSequence ( kv, state) => match state {
439+ MapAsSequenceValidatorState :: Tuple | MapAsSequenceValidatorState :: Key => {
440+ Some ( From :: from ( & * kv[ 0 ] ) )
441+ }
442+ MapAsSequenceValidatorState :: Value => Some ( From :: from ( & * kv[ 1 ] ) ) ,
443+ } ,
444+ InnerDataTypeValidatorKind :: Array ( inner_type) => Some ( From :: from ( * inner_type) ) ,
445+ InnerDataTypeValidatorKind :: Nullable ( inner_type) => Some ( From :: from ( * inner_type) ) ,
446+ InnerDataTypeValidatorKind :: Tuple ( elements_types) => {
447+ Some ( From :: from ( & elements_types[ 0 ] ) )
448+ }
449+ InnerDataTypeValidatorKind :: FixedString ( _len) => None ,
450+ InnerDataTypeValidatorKind :: RootTuple ( columns, current_index) => {
451+ Some ( From :: from ( & columns[ * current_index] . data_type ) )
452+ }
453+ InnerDataTypeValidatorKind :: RootArray ( inner_data_type) => {
454+ Some ( From :: from ( * inner_data_type) )
455+ }
456+ InnerDataTypeValidatorKind :: Variant ( possible_types, state) => match state {
457+ VariantValidationState :: Pending => {
458+ unreachable ! ( )
459+ }
460+ VariantValidationState :: Identifier ( value) => {
461+ let data_type = & possible_types[ * value as usize ] ;
462+ Some ( From :: from ( data_type) )
463+ }
464+ } ,
465+ InnerDataTypeValidatorKind :: Enum ( _values_map) => {
466+ unreachable ! ( )
467+ }
468+ }
469+ }
405470}
406471
407472impl < R : Row > Drop for InnerDataTypeValidator < ' _ , ' _ , R > {
@@ -651,6 +716,10 @@ impl<R: Row> SchemaValidator<R> for () {
651716 fn get_field_name ( & self , _struct_idx : usize ) -> Option < & ' static str > {
652717 unreachable ! ( )
653718 }
719+
720+ fn peek ( & self ) -> Option < SerdeType > {
721+ unreachable ! ( )
722+ }
654723}
655724
656725/// Which Serde data type (De)serializer used for the given type.
@@ -690,6 +759,51 @@ pub(crate) enum SerdeType {
690759 // IgnoredAny,
691760}
692761
762+ impl From < & DataTypeNode > for SerdeType {
763+ fn from ( data_type : & DataTypeNode ) -> Self {
764+ match dbg ! ( data_type. remove_low_cardinality( ) ) {
765+ DataTypeNode :: Bool => SerdeType :: Bool ,
766+ DataTypeNode :: Int8 | DataTypeNode :: Enum ( EnumType :: Enum8 , _) => SerdeType :: I8 ,
767+ DataTypeNode :: Int16 | DataTypeNode :: Enum ( EnumType :: Enum16 , _) => SerdeType :: I16 ,
768+ DataTypeNode :: Int32
769+ | DataTypeNode :: Date32
770+ | DataTypeNode :: Time
771+ | DataTypeNode :: Decimal ( _, _, DecimalType :: Decimal32 ) => SerdeType :: I32 ,
772+ DataTypeNode :: Int64
773+ | DataTypeNode :: DateTime64 ( _, _)
774+ | DataTypeNode :: Time64 ( _)
775+ | DataTypeNode :: Decimal ( _, _, DecimalType :: Decimal64 )
776+ | DataTypeNode :: Interval ( _) => SerdeType :: I64 ,
777+ DataTypeNode :: Int128 | DataTypeNode :: Decimal ( _, _, DecimalType :: Decimal128 ) => {
778+ SerdeType :: I128
779+ }
780+ DataTypeNode :: UInt8 => SerdeType :: U8 ,
781+ DataTypeNode :: UInt16 | DataTypeNode :: Date => SerdeType :: U16 ,
782+ DataTypeNode :: UInt32 | DataTypeNode :: DateTime ( _) | DataTypeNode :: IPv4 => SerdeType :: U32 ,
783+ DataTypeNode :: UInt64 => SerdeType :: U64 ,
784+ DataTypeNode :: UInt128 => SerdeType :: U128 ,
785+ DataTypeNode :: Float32 => SerdeType :: F32 ,
786+ DataTypeNode :: Float64 => SerdeType :: F64 ,
787+ DataTypeNode :: String | DataTypeNode :: JSON => SerdeType :: String ,
788+ DataTypeNode :: Nullable ( _) => SerdeType :: Option ,
789+ DataTypeNode :: Array ( _)
790+ | DataTypeNode :: Ring
791+ | DataTypeNode :: Polygon
792+ | DataTypeNode :: MultiPolygon
793+ | DataTypeNode :: LineString
794+ | DataTypeNode :: MultiLineString => SerdeType :: Seq ( 0 ) ,
795+ DataTypeNode :: Tuple ( elements) => SerdeType :: Tuple ( elements. len ( ) ) ,
796+ DataTypeNode :: FixedString ( len) => SerdeType :: Tuple ( * len) ,
797+ DataTypeNode :: IPv6 => SerdeType :: Tuple ( 16 ) ,
798+ DataTypeNode :: UUID => SerdeType :: Tuple ( UUID_TUPLE_ELEMENTS . len ( ) ) ,
799+ DataTypeNode :: Point => SerdeType :: Tuple ( POINT_TUPLE_ELEMENTS . len ( ) ) ,
800+ DataTypeNode :: Map ( _) => SerdeType :: Map ( 0 ) ,
801+ DataTypeNode :: Variant ( _) => SerdeType :: Enum ,
802+ _ => unimplemented ! ( ) ,
803+ }
804+ }
805+ }
806+
693807impl Display for SerdeType {
694808 fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
695809 match self {
0 commit comments