11//! Conversion routes from/to WIT types.
2+ use std:: collections:: HashMap ;
3+
24use arrow:: {
35 array:: ArrayRef ,
46 datatypes:: { DataType , Field , IntervalUnit , TimeUnit , UnionFields , UnionMode } ,
@@ -94,7 +96,7 @@ fn check_union_fields(
9496 let token = token. sub ( ) ?;
9597
9698 for ( _idx, field) in ufields. iter ( ) {
97- check_field ( field, & token) ?;
99+ check_field ( field, & token) . context ( "field" ) ?;
98100 }
99101 Ok ( ( ) )
100102}
@@ -167,26 +169,26 @@ fn check_data_type(
167169 | DataType :: FixedSizeList ( field, _)
168170 | DataType :: LargeList ( field)
169171 | DataType :: LargeListView ( field)
170- | DataType :: Map ( field, _) => check_field ( field, & token) ,
172+ | DataType :: Map ( field, _) => check_field ( field, & token) . context ( "field" ) ,
171173 DataType :: Struct ( fields) => {
172- for field in fields {
173- check_field ( field, & token) ?;
174+ for ( idx , field) in fields. iter ( ) . enumerate ( ) {
175+ check_field ( field, & token) . with_context ( || format ! ( "field {idx}" ) ) ?;
174176 }
175177 Ok ( ( ) )
176178 }
177179 DataType :: Union ( ufields, umode) => {
178- check_union_fields ( ufields, & token) ?;
179- check_union_mode ( umode, & token) ?;
180+ check_union_fields ( ufields, & token) . context ( "union fields" ) ?;
181+ check_union_mode ( umode, & token) . context ( "union mode" ) ?;
180182 Ok ( ( ) )
181183 }
182184 DataType :: Dictionary ( dt1, dt2) => {
183- check_data_type ( dt1, & token) ?;
184- check_data_type ( dt2, & token) ?;
185+ check_data_type ( dt1, & token) . context ( "key type" ) ?;
186+ check_data_type ( dt2, & token) . context ( "value type" ) ?;
185187 Ok ( ( ) )
186188 }
187189 DataType :: RunEndEncoded ( field1, field2) => {
188- check_field ( field1, & token) ?;
189- check_field ( field2, & token) ?;
190+ check_field ( field1, & token) . context ( "REE run-ends field" ) ?;
191+ check_field ( field2, & token) . context ( "REE value field" ) ?;
190192 Ok ( ( ) )
191193 }
192194 }
@@ -196,12 +198,24 @@ fn check_data_type(
196198fn check_field ( field : & Field , token : & limits:: ComplexityToken ) -> datafusion_common:: Result < ( ) > {
197199 let token = token. sub ( ) ?;
198200
199- token. check_identifier ( field. name ( ) ) ?;
200- check_data_type ( field. data_type ( ) , & token) ?;
201+ token. check_identifier ( field. name ( ) ) . context ( "field name" ) ?;
202+ check_data_type ( field. data_type ( ) , & token) . context ( "field data type" ) ?;
203+ check_metadata ( field. metadata ( ) , & token) . context ( "field metadata" ) ?;
204+
205+ Ok ( ( ) )
206+ }
207+
208+ /// Check metadata complexity.
209+ fn check_metadata (
210+ md : & HashMap < String , String > ,
211+ token : & limits:: ComplexityToken ,
212+ ) -> datafusion_common:: Result < ( ) > {
213+ let token = token. sub ( ) ?;
201214
202- for ( k, v) in field. metadata ( ) {
203- token. check_identifier ( k) ?;
204- token. check_aux_string ( v) ?;
215+ for ( k, v) in md {
216+ let token = token. sub ( ) ?;
217+ token. check_identifier ( k) . context ( "metadata key" ) ?;
218+ token. check_aux_string ( v) . context ( "metadata value" ) ?;
205219 }
206220
207221 Ok ( ( ) )
0 commit comments