@@ -28,7 +28,7 @@ use crate::{extension::ExtensionType, ArrowError, DataType};
28
28
/// The storage type of this extension is **Struct containing two binary fields**:
29
29
/// - metadata: Binary field containing the variant metadata
30
30
/// - value: Binary field containing the serialized variant data
31
- ///
31
+ ///
32
32
/// A Variant is a flexible structure that can store **Primitives, Arrays, or Objects**.
33
33
///
34
34
/// Both metadata and value fields are required.
@@ -101,22 +101,26 @@ impl ExtensionType for Variant {
101
101
"Variant struct must have exactly two fields" . to_owned ( ) ,
102
102
) ) ;
103
103
}
104
-
105
- let metadata_field = fields. iter ( )
106
- . find ( |f| f. name ( ) == "metadata" )
107
- . ok_or_else ( || ArrowError :: InvalidArgumentError (
108
- "Variant struct must have a field named 'metadata'" . to_owned ( ) ,
109
- ) ) ?;
110
-
111
- let value_field = fields. iter ( )
112
- . find ( |f| f. name ( ) == "value" )
113
- . ok_or_else ( || ArrowError :: InvalidArgumentError (
104
+
105
+ let metadata_field =
106
+ fields
107
+ . iter ( )
108
+ . find ( |f| f. name ( ) == "metadata" )
109
+ . ok_or_else ( || {
110
+ ArrowError :: InvalidArgumentError (
111
+ "Variant struct must have a field named 'metadata'" . to_owned ( ) ,
112
+ )
113
+ } ) ?;
114
+
115
+ let value_field = fields. iter ( ) . find ( |f| f. name ( ) == "value" ) . ok_or_else ( || {
116
+ ArrowError :: InvalidArgumentError (
114
117
"Variant struct must have a field named 'value'" . to_owned ( ) ,
115
- ) ) ?;
118
+ )
119
+ } ) ?;
116
120
117
121
match ( metadata_field. data_type ( ) , value_field. data_type ( ) ) {
118
- ( DataType :: Binary , DataType :: Binary ) |
119
- ( DataType :: LargeBinary , DataType :: LargeBinary ) => {
122
+ ( DataType :: Binary , DataType :: Binary )
123
+ | ( DataType :: LargeBinary , DataType :: LargeBinary ) => {
120
124
if metadata_field. is_nullable ( ) || value_field. is_nullable ( ) {
121
125
return Err ( ArrowError :: InvalidArgumentError (
122
126
"Variant struct fields must not be nullable" . to_owned ( ) ,
@@ -149,24 +153,27 @@ mod tests {
149
153
use crate :: extension:: CanonicalExtensionType ;
150
154
use crate :: {
151
155
extension:: { EXTENSION_TYPE_METADATA_KEY , EXTENSION_TYPE_NAME_KEY } ,
152
- Field , DataType ,
156
+ DataType , Field ,
153
157
} ;
154
158
155
159
use super :: * ;
156
160
157
161
#[ test]
158
162
fn valid ( ) -> Result < ( ) , ArrowError > {
159
- let struct_type = DataType :: Struct ( vec ! [
160
- Field :: new( "metadata" , DataType :: Binary , false ) ,
161
- Field :: new( "value" , DataType :: Binary , false )
162
- ] . into ( ) ) ;
163
-
163
+ let struct_type = DataType :: Struct (
164
+ vec ! [
165
+ Field :: new( "metadata" , DataType :: Binary , false ) ,
166
+ Field :: new( "value" , DataType :: Binary , false ) ,
167
+ ]
168
+ . into ( ) ,
169
+ ) ;
170
+
164
171
let mut field = Field :: new ( "" , struct_type, false ) ;
165
172
let variant = Variant :: new ( Vec :: new ( ) , Vec :: new ( ) ) ;
166
-
173
+
167
174
field. try_with_extension_type ( variant. clone ( ) ) ?;
168
175
field. try_extension_type :: < Variant > ( ) ?;
169
-
176
+
170
177
#[ cfg( feature = "canonical_extension_types" ) ]
171
178
assert_eq ! (
172
179
field. try_canonical_extension_type( ) ?,
@@ -179,11 +186,14 @@ mod tests {
179
186
#[ test]
180
187
#[ should_panic( expected = "Field extension type name missing" ) ]
181
188
fn missing_name ( ) {
182
- let struct_type = DataType :: Struct ( vec ! [
183
- Field :: new( "metadata" , DataType :: Binary , false ) ,
184
- Field :: new( "value" , DataType :: Binary , false )
185
- ] . into ( ) ) ;
186
-
189
+ let struct_type = DataType :: Struct (
190
+ vec ! [
191
+ Field :: new( "metadata" , DataType :: Binary , false ) ,
192
+ Field :: new( "value" , DataType :: Binary , false ) ,
193
+ ]
194
+ . into ( ) ,
195
+ ) ;
196
+
187
197
let field = Field :: new ( "" , struct_type, false ) . with_metadata (
188
198
[ ( EXTENSION_TYPE_METADATA_KEY . to_owned ( ) , "" . to_owned ( ) ) ]
189
199
. into_iter ( )
@@ -201,15 +211,21 @@ mod tests {
201
211
#[ test]
202
212
#[ should_panic( expected = "Variant extension type expects an empty string as metadata" ) ]
203
213
fn invalid_metadata ( ) {
204
- let struct_type = DataType :: Struct ( vec ! [
205
- Field :: new( "metadata" , DataType :: Binary , false ) ,
206
- Field :: new( "value" , DataType :: Binary , false )
207
- ] . into ( ) ) ;
208
-
214
+ let struct_type = DataType :: Struct (
215
+ vec ! [
216
+ Field :: new( "metadata" , DataType :: Binary , false ) ,
217
+ Field :: new( "value" , DataType :: Binary , false ) ,
218
+ ]
219
+ . into ( ) ,
220
+ ) ;
221
+
209
222
let field = Field :: new ( "" , struct_type, false ) . with_metadata (
210
223
[
211
224
( EXTENSION_TYPE_NAME_KEY . to_owned ( ) , Variant :: NAME . to_owned ( ) ) ,
212
- ( EXTENSION_TYPE_METADATA_KEY . to_owned ( ) , "non-empty" . to_owned ( ) ) ,
225
+ (
226
+ EXTENSION_TYPE_METADATA_KEY . to_owned ( ) ,
227
+ "non-empty" . to_owned ( ) ,
228
+ ) ,
213
229
]
214
230
. into_iter ( )
215
231
. collect ( ) ,
@@ -221,14 +237,20 @@ mod tests {
221
237
fn variant_supports_valid_data_types ( ) {
222
238
// Test valid struct types
223
239
let valid_types = [
224
- DataType :: Struct ( vec ! [
225
- Field :: new( "metadata" , DataType :: Binary , false ) ,
226
- Field :: new( "value" , DataType :: Binary , false )
227
- ] . into ( ) ) ,
228
- DataType :: Struct ( vec ! [
229
- Field :: new( "metadata" , DataType :: LargeBinary , false ) ,
230
- Field :: new( "value" , DataType :: LargeBinary , false )
231
- ] . into ( ) )
240
+ DataType :: Struct (
241
+ vec ! [
242
+ Field :: new( "metadata" , DataType :: Binary , false ) ,
243
+ Field :: new( "value" , DataType :: Binary , false ) ,
244
+ ]
245
+ . into ( ) ,
246
+ ) ,
247
+ DataType :: Struct (
248
+ vec ! [
249
+ Field :: new( "metadata" , DataType :: LargeBinary , false ) ,
250
+ Field :: new( "value" , DataType :: LargeBinary , false ) ,
251
+ ]
252
+ . into ( ) ,
253
+ ) ,
232
254
] ;
233
255
234
256
for data_type in valid_types {
@@ -240,14 +262,20 @@ mod tests {
240
262
let invalid_types = [
241
263
DataType :: Utf8 ,
242
264
DataType :: Struct ( vec ! [ Field :: new( "single" , DataType :: Binary , false ) ] . into ( ) ) ,
243
- DataType :: Struct ( vec ! [
244
- Field :: new( "wrong1" , DataType :: Binary , false ) ,
245
- Field :: new( "wrong2" , DataType :: Binary , false )
246
- ] . into ( ) ) ,
247
- DataType :: Struct ( vec ! [
248
- Field :: new( "metadata" , DataType :: Binary , true ) , // nullable
249
- Field :: new( "value" , DataType :: Binary , false )
250
- ] . into ( ) )
265
+ DataType :: Struct (
266
+ vec ! [
267
+ Field :: new( "wrong1" , DataType :: Binary , false ) ,
268
+ Field :: new( "wrong2" , DataType :: Binary , false ) ,
269
+ ]
270
+ . into ( ) ,
271
+ ) ,
272
+ DataType :: Struct (
273
+ vec ! [
274
+ Field :: new( "metadata" , DataType :: Binary , true ) , // nullable
275
+ Field :: new( "value" , DataType :: Binary , false ) ,
276
+ ]
277
+ . into ( ) ,
278
+ ) ,
251
279
] ;
252
280
253
281
for data_type in invalid_types {
0 commit comments