@@ -31,7 +31,7 @@ mod string;
3131mod varchar;
3232
3333use crate :: col_type:: { ColumnType , ColumnTypeTag } ;
34- use crate :: error:: CoreResult ;
34+ use crate :: error:: { CoreResult , fmt_err } ;
3535
3636pub use array:: * ;
3737pub use binary:: * ;
@@ -57,32 +57,33 @@ pub trait ColumnDriver {
5757}
5858
5959/// Obtain a type driver from the provided column type.
60- pub fn lookup_driver ( col_type : ColumnType ) -> & ' static dyn ColumnDriver {
60+ pub fn try_lookup_driver ( col_type : ColumnType ) -> CoreResult < & ' static dyn ColumnDriver > {
6161 match ( col_type. tag ( ) , col_type. is_designated ( ) ) {
62- ( ColumnTypeTag :: Boolean , _) => & BooleanDriver ,
63- ( ColumnTypeTag :: Byte , _) => & ByteDriver ,
64- ( ColumnTypeTag :: Short , _) => & ShortDriver ,
65- ( ColumnTypeTag :: Char , _) => & CharDriver ,
66- ( ColumnTypeTag :: Int , _) => & IntDriver ,
67- ( ColumnTypeTag :: Long , _) => & LongDriver ,
68- ( ColumnTypeTag :: Date , _) => & DateDriver ,
69- ( ColumnTypeTag :: Timestamp , false ) => & TimestampDriver ,
70- ( ColumnTypeTag :: Timestamp , true ) => & DesignatedTimestampDriver ,
71- ( ColumnTypeTag :: Float , _) => & FloatDriver ,
72- ( ColumnTypeTag :: Double , _) => & DoubleDriver ,
73- ( ColumnTypeTag :: String , _) => & StringDriver ,
74- ( ColumnTypeTag :: Symbol , _) => & SymbolDriver ,
75- ( ColumnTypeTag :: Long256 , _) => & Long256Driver ,
76- ( ColumnTypeTag :: GeoByte , _) => & GeoByteDriver ,
77- ( ColumnTypeTag :: GeoShort , _) => & GeoShortDriver ,
78- ( ColumnTypeTag :: GeoInt , _) => & GeoIntDriver ,
79- ( ColumnTypeTag :: GeoLong , _) => & GeoLongDriver ,
80- ( ColumnTypeTag :: Binary , _) => & BinaryDriver ,
81- ( ColumnTypeTag :: Uuid , _) => & UuidDriver ,
82- ( ColumnTypeTag :: Long128 , _) => & Long128Driver ,
83- ( ColumnTypeTag :: IPv4 , _) => & IPv4Driver ,
84- ( ColumnTypeTag :: Varchar , _) => & VarcharDriver ,
85- ( ColumnTypeTag :: Array , _) => & ArrayDriver ,
62+ ( ColumnTypeTag :: Boolean , _) => Ok ( & BooleanDriver ) ,
63+ ( ColumnTypeTag :: Byte , _) => Ok ( & ByteDriver ) ,
64+ ( ColumnTypeTag :: Short , _) => Ok ( & ShortDriver ) ,
65+ ( ColumnTypeTag :: Char , _) => Ok ( & CharDriver ) ,
66+ ( ColumnTypeTag :: Int , _) => Ok ( & IntDriver ) ,
67+ ( ColumnTypeTag :: Long , _) => Ok ( & LongDriver ) ,
68+ ( ColumnTypeTag :: Date , _) => Ok ( & DateDriver ) ,
69+ ( ColumnTypeTag :: Timestamp , false ) => Ok ( & TimestampDriver ) ,
70+ ( ColumnTypeTag :: Timestamp , true ) => Ok ( & DesignatedTimestampDriver ) ,
71+ ( ColumnTypeTag :: Float , _) => Ok ( & FloatDriver ) ,
72+ ( ColumnTypeTag :: Double , _) => Ok ( & DoubleDriver ) ,
73+ ( ColumnTypeTag :: String , _) => Ok ( & StringDriver ) ,
74+ ( ColumnTypeTag :: Symbol , _) => Ok ( & SymbolDriver ) ,
75+ ( ColumnTypeTag :: Long256 , _) => Ok ( & Long256Driver ) ,
76+ ( ColumnTypeTag :: GeoByte , _) => Ok ( & GeoByteDriver ) ,
77+ ( ColumnTypeTag :: GeoShort , _) => Ok ( & GeoShortDriver ) ,
78+ ( ColumnTypeTag :: GeoInt , _) => Ok ( & GeoIntDriver ) ,
79+ ( ColumnTypeTag :: GeoLong , _) => Ok ( & GeoLongDriver ) ,
80+ ( ColumnTypeTag :: Binary , _) => Ok ( & BinaryDriver ) ,
81+ ( ColumnTypeTag :: Uuid , _) => Ok ( & UuidDriver ) ,
82+ ( ColumnTypeTag :: Long128 , _) => Ok ( & Long128Driver ) ,
83+ ( ColumnTypeTag :: IPv4 , _) => Ok ( & IPv4Driver ) ,
84+ ( ColumnTypeTag :: Varchar , _) => Ok ( & VarcharDriver ) ,
85+ ( ColumnTypeTag :: Array , _) => Ok ( & ArrayDriver ) ,
86+ _ => Err ( fmt_err ! ( InvalidType , "unexpected column type {}" , col_type, ) ) ,
8687 }
8788}
8889
@@ -122,11 +123,19 @@ mod tests {
122123 ( ColumnTypeTag :: Long128 . into_type( ) , "long128" ) ,
123124 ( ColumnTypeTag :: IPv4 . into_type( ) , "ipv4" ) ,
124125 ( ColumnTypeTag :: Varchar . into_type( ) , "varchar" ) ,
126+ ( ColumnTypeTag :: Array . into_type( ) , "array" ) ,
125127 ] ;
126128 for ( col_type, exp_descr) in cases. iter ( ) . copied ( ) {
127- let driver = lookup_driver ( col_type) ;
129+ let driver = try_lookup_driver ( col_type) . unwrap ( ) ;
128130 let actual_descr = driver. descr ( ) ;
129131 assert_eq ! ( actual_descr, exp_descr) ;
130132 }
131133 }
134+
135+ #[ test]
136+ fn test_lookup_driver_undefined_errors ( ) {
137+ // Undefined via code 0 should error
138+ let undefined = ColumnType :: new ( ColumnTypeTag :: Undefined , 0 ) ;
139+ assert ! ( try_lookup_driver( undefined) . is_err( ) ) ;
140+ }
132141}
0 commit comments