17
17
18
18
use crate :: {
19
19
AvroResult ,
20
- decode:: { decode_len, decode_long} ,
21
20
encode:: { encode_bytes, encode_long} ,
22
21
error:: Details ,
23
- types :: Value ,
22
+ util :: { decode_len_simple , decode_variable } ,
24
23
} ;
25
24
pub use bigdecimal:: BigDecimal ;
26
25
use num_bigint:: BigInt ;
@@ -47,19 +46,21 @@ pub(crate) fn serialize_big_decimal(decimal: &BigDecimal) -> AvroResult<Vec<u8>>
47
46
Ok ( final_buffer)
48
47
}
49
48
50
- pub ( crate ) fn deserialize_big_decimal ( bytes : & Vec < u8 > ) -> AvroResult < BigDecimal > {
51
- let mut bytes: & [ u8 ] = bytes. as_slice ( ) ;
52
- let mut big_decimal_buffer = match decode_len ( & mut bytes) {
53
- Ok ( size) => vec ! [ 0u8 ; size] ,
49
+ pub ( crate ) fn deserialize_big_decimal ( mut bytes : & [ u8 ] ) -> AvroResult < BigDecimal > {
50
+ let mut big_decimal_buffer = match decode_len_simple ( bytes) {
51
+ Ok ( ( size, bytes_read) ) => {
52
+ bytes = & bytes[ bytes_read..] ;
53
+ vec ! [ 0u8 ; size]
54
+ }
54
55
Err ( err) => return Err ( Details :: BigDecimalLen ( Box :: new ( err) ) . into ( ) ) ,
55
56
} ;
56
57
57
58
bytes
58
59
. read_exact ( & mut big_decimal_buffer[ ..] )
59
60
. map_err ( Details :: ReadDouble ) ?;
60
61
61
- match decode_long ( & mut bytes) {
62
- Ok ( Value :: Long ( scale_value) ) => {
62
+ match decode_variable ( bytes) {
63
+ Ok ( Some ( ( scale_value, _ ) ) ) => {
63
64
let big_int: BigInt = BigInt :: from_signed_bytes_be ( & big_decimal_buffer) ;
64
65
let decimal = BigDecimal :: new ( big_int, scale_value) ;
65
66
Ok ( decimal)
@@ -71,7 +72,11 @@ pub(crate) fn deserialize_big_decimal(bytes: &Vec<u8>) -> AvroResult<BigDecimal>
71
72
#[ cfg( test) ]
72
73
mod tests {
73
74
use super :: * ;
74
- use crate :: { Codec , Reader , Schema , Writer , error:: Error , types:: Record } ;
75
+ use crate :: {
76
+ Codec , Reader , Schema , Writer ,
77
+ error:: Error ,
78
+ types:: { Record , Value } ,
79
+ } ;
75
80
use apache_avro_test_helper:: TestResult ;
76
81
use bigdecimal:: { One , Zero } ;
77
82
use pretty_assertions:: assert_eq;
@@ -92,7 +97,8 @@ mod tests {
92
97
let buffer: Vec < u8 > = serialize_big_decimal ( & current) ?;
93
98
94
99
let mut as_slice = buffer. as_slice ( ) ;
95
- decode_long ( & mut as_slice) ?;
100
+ let ( _, bytes_read) = decode_variable ( as_slice) ?. unwrap ( ) ;
101
+ as_slice = & as_slice[ bytes_read..] ;
96
102
97
103
let mut result: Vec < u8 > = Vec :: new ( ) ;
98
104
result. extend_from_slice ( as_slice) ;
@@ -109,7 +115,8 @@ mod tests {
109
115
110
116
let buffer: Vec < u8 > = serialize_big_decimal ( & BigDecimal :: zero ( ) ) ?;
111
117
let mut as_slice = buffer. as_slice ( ) ;
112
- decode_long ( & mut as_slice) ?;
118
+ let ( _, bytes_read) = decode_variable ( as_slice) ?. unwrap ( ) ;
119
+ as_slice = & as_slice[ bytes_read..] ;
113
120
114
121
let mut result: Vec < u8 > = Vec :: new ( ) ;
115
122
result. extend_from_slice ( as_slice) ;
0 commit comments