@@ -51,12 +51,14 @@ fn create_session_context() -> Result<SessionContext> {
5151
5252 // The registration creates a new instance of the extension type with the deserialized metadata.
5353 let temp_registration =
54- DefaultExtensionTypeRegistration :: new_arc ( |storage_type, metadata| {
55- Ok ( TemperatureExtensionType :: new (
56- storage_type. clone ( ) ,
57- metadata,
58- ) )
59- } ) ;
54+ DefaultExtensionTypeRegistration :: < TemperatureExtensionType > :: new_arc (
55+ |storage_type, metadata| {
56+ Ok ( Arc :: new ( TemperatureExtensionType :: try_new (
57+ storage_type,
58+ metadata,
59+ ) ?) )
60+ } ,
61+ ) ;
6062 registry. add_extension_type_registration ( temp_registration) ?;
6163
6264 let state = SessionStateBuilder :: default ( )
@@ -97,13 +99,25 @@ fn example_schema() -> SchemaRef {
9799 Arc :: new ( Schema :: new ( vec ! [
98100 Field :: new( "city" , DataType :: Utf8 , false ) ,
99101 Field :: new( "celsius" , DataType :: Float64 , false ) . with_extension_type(
100- TemperatureExtensionType :: new( DataType :: Float64 , TemperatureUnit :: Celsius ) ,
102+ TemperatureExtensionType :: try_new(
103+ & DataType :: Float64 ,
104+ TemperatureUnit :: Celsius ,
105+ )
106+ . expect( "Valid Type" ) ,
101107 ) ,
102108 Field :: new( "fahrenheit" , DataType :: Float64 , false ) . with_extension_type(
103- TemperatureExtensionType :: new( DataType :: Float64 , TemperatureUnit :: Fahrenheit ) ,
109+ TemperatureExtensionType :: try_new(
110+ & DataType :: Float64 ,
111+ TemperatureUnit :: Fahrenheit ,
112+ )
113+ . expect( "Valid Type" ) ,
104114 ) ,
105115 Field :: new( "kelvin" , DataType :: Float32 , false ) . with_extension_type(
106- TemperatureExtensionType :: new( DataType :: Float32 , TemperatureUnit :: Kelvin ) ,
116+ TemperatureExtensionType :: try_new(
117+ & DataType :: Float32 ,
118+ TemperatureUnit :: Kelvin ,
119+ )
120+ . expect( "Valid Type" ) ,
107121 ) ,
108122 ] ) )
109123}
@@ -144,11 +158,16 @@ pub struct TemperatureExtensionType {
144158
145159impl TemperatureExtensionType {
146160 /// Creates a new [`TemperatureExtensionType`].
147- pub fn new ( storage_type : DataType , temperature_unit : TemperatureUnit ) -> Self {
148- Self {
149- storage_type,
161+ pub fn try_new (
162+ storage_type : & DataType ,
163+ temperature_unit : TemperatureUnit ,
164+ ) -> Result < Self > {
165+ let result = Self {
166+ storage_type : storage_type. clone ( ) ,
150167 temperature_unit,
151- }
168+ } ;
169+ result. supports_data_type ( & storage_type) ?; // Validate the storage type
170+ Ok ( result)
152171 }
153172}
154173
@@ -212,7 +231,7 @@ impl ExtensionType for TemperatureExtensionType {
212231 data_type : & DataType ,
213232 metadata : Self :: Metadata ,
214233 ) -> std:: result:: Result < Self , ArrowError > {
215- let instance = Self :: new ( data_type. clone ( ) , metadata) ;
234+ let instance = Self :: try_new ( data_type, metadata) ? ;
216235 instance. supports_data_type ( data_type) ?;
217236 Ok ( instance)
218237 }
0 commit comments