@@ -21,7 +21,7 @@ use apache_avro::schema::RecordSchema;
21
21
use apache_avro:: {
22
22
schema:: { Schema as AvroSchema , SchemaKind } ,
23
23
types:: Value ,
24
- AvroResult , Error as AvroError , Reader as AvroReader ,
24
+ Error as AvroError , Reader as AvroReader ,
25
25
} ;
26
26
use arrow:: array:: {
27
27
make_array, Array , ArrayBuilder , ArrayData , ArrayDataBuilder , ArrayRef ,
@@ -938,40 +938,34 @@ fn resolve_string(v: &Value) -> ArrowResult<Option<String>> {
938
938
. map_err ( |e| SchemaError ( format ! ( "expected resolvable string : {e:?}" ) ) )
939
939
}
940
940
941
- fn resolve_u8 ( v : & Value ) -> AvroResult < u8 > {
942
- let int = match v {
943
- Value :: Int ( n) => Ok ( Value :: Int ( * n) ) ,
944
- Value :: Long ( n) => Ok ( Value :: Int ( * n as i32 ) ) ,
945
- other => Err ( AvroError :: GetU8 ( other. into ( ) ) ) ,
946
- } ?;
947
- if let Value :: Int ( n) = int {
948
- if n >= 0 && n <= From :: from ( u8:: MAX ) {
949
- return Ok ( n as u8 ) ;
950
- }
951
- }
941
+ fn resolve_u8 ( v : & Value ) -> Option < u8 > {
942
+ let v = match v {
943
+ Value :: Union ( _, inner) => inner. as_ref ( ) , // &Box<Value> -> &Value
944
+ _ => v,
945
+ } ;
952
946
953
- Err ( AvroError :: GetU8 ( int. into ( ) ) )
947
+ match v {
948
+ Value :: Int ( n) if ( 0 ..=u8:: MAX as i32 ) . contains ( n) => Some ( * n as u8 ) ,
949
+ Value :: Long ( n) if ( 0 ..=u8:: MAX as i64 ) . contains ( n) => Some ( * n as u8 ) ,
950
+ _ => None ,
951
+ }
954
952
}
955
953
956
954
fn resolve_bytes ( v : & Value ) -> Option < Vec < u8 > > {
957
- let v = if let Value :: Union ( _, b) = v { b } else { v } ;
955
+ let v = match v {
956
+ Value :: Union ( _, inner) => inner. as_ref ( ) ,
957
+ _ => v,
958
+ } ;
959
+
958
960
match v {
959
- Value :: Bytes ( _) => Ok ( v. clone ( ) ) ,
960
- Value :: String ( s) => Ok ( Value :: Bytes ( s. clone ( ) . into_bytes ( ) ) ) ,
961
- Value :: Array ( items) => Ok ( Value :: Bytes (
962
- items
963
- . iter ( )
964
- . map ( resolve_u8)
965
- . collect :: < Result < Vec < _ > , _ > > ( )
966
- . ok ( ) ?,
967
- ) ) ,
968
- other => Err ( AvroError :: GetBytes ( other. into ( ) ) ) ,
969
- }
970
- . ok ( )
971
- . and_then ( |v| match v {
972
- Value :: Bytes ( s) => Some ( s) ,
961
+ Value :: Bytes ( bytes) => Some ( bytes. clone ( ) ) ,
962
+ Value :: String ( s) => Some ( s. as_bytes ( ) . to_vec ( ) ) ,
963
+ Value :: Array ( items) => {
964
+ let bytes: Option < Vec < u8 > > = items. iter ( ) . map ( resolve_u8) . collect ( ) ;
965
+ bytes
966
+ }
973
967
_ => None ,
974
- } )
968
+ }
975
969
}
976
970
977
971
fn resolve_fixed ( v : & Value , size : usize ) -> Option < Vec < u8 > > {
0 commit comments