@@ -21,7 +21,7 @@ use super::constants::*;
21
21
use super :: error:: * ;
22
22
use super :: jentry:: JEntry ;
23
23
use super :: number:: Number ;
24
- use super :: parser:: decode_value ;
24
+ use super :: parser:: parse_value ;
25
25
use super :: value:: Value ;
26
26
use crate :: jsonpath:: ArrayIndex ;
27
27
use crate :: jsonpath:: Index ;
@@ -125,8 +125,10 @@ pub fn build_object<'a, K: AsRef<str>>(
125
125
/// Get the length of `JSONB` array.
126
126
pub fn array_length ( value : & [ u8 ] ) -> Option < usize > {
127
127
if !is_jsonb ( value) {
128
- let json_value = decode_value ( value) . unwrap ( ) ;
129
- return json_value. array_length ( ) ;
128
+ return match parse_value ( value) {
129
+ Ok ( val) => val. array_length ( ) ,
130
+ Err ( _) => None ,
131
+ } ;
130
132
}
131
133
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
132
134
match header & CONTAINER_HEADER_TYPE_MASK {
@@ -143,9 +145,13 @@ pub fn array_length(value: &[u8]) -> Option<usize> {
143
145
pub fn get_by_path < ' a > ( value : & ' a [ u8 ] , json_path : JsonPath < ' a > ) -> Vec < Vec < u8 > > {
144
146
let selector = Selector :: new ( json_path) ;
145
147
if !is_jsonb ( value) {
146
- let json_value = decode_value ( value) . unwrap ( ) ;
147
- let value = json_value. to_vec ( ) ;
148
- selector. select ( value. as_slice ( ) )
148
+ match parse_value ( value) {
149
+ Ok ( val) => {
150
+ let value = val. to_vec ( ) ;
151
+ selector. select ( value. as_slice ( ) )
152
+ }
153
+ Err ( _) => vec ! [ ] ,
154
+ }
149
155
} else {
150
156
selector. select ( value)
151
157
}
@@ -192,8 +198,10 @@ pub fn get_by_name(value: &[u8], name: &str) -> Option<Vec<u8>> {
192
198
/// Get the inner element of `JSONB` Object by key name ignoring case.
193
199
pub fn get_by_name_ignore_case ( value : & [ u8 ] , name : & str ) -> Option < Vec < u8 > > {
194
200
if !is_jsonb ( value) {
195
- let json_value = decode_value ( value) . unwrap ( ) ;
196
- return json_value. get_by_name_ignore_case ( name) . map ( Value :: to_vec) ;
201
+ return match parse_value ( value) {
202
+ Ok ( val) => val. get_by_name_ignore_case ( name) . map ( Value :: to_vec) ,
203
+ Err ( _) => None ,
204
+ } ;
197
205
}
198
206
199
207
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
@@ -261,8 +269,10 @@ pub fn get_by_name_ignore_case(value: &[u8], name: &str) -> Option<Vec<u8>> {
261
269
/// Get the keys of a `JSONB` object.
262
270
pub fn object_keys ( value : & [ u8 ] ) -> Option < Vec < u8 > > {
263
271
if !is_jsonb ( value) {
264
- let json_value = decode_value ( value) . unwrap ( ) ;
265
- return json_value. object_keys ( ) . map ( |val| val. to_vec ( ) ) ;
272
+ return match parse_value ( value) {
273
+ Ok ( val) => val. object_keys ( ) . map ( |val| val. to_vec ( ) ) ,
274
+ Err ( _) => None ,
275
+ } ;
266
276
}
267
277
268
278
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
@@ -304,11 +314,11 @@ pub fn object_keys(value: &[u8]) -> Option<Vec<u8>> {
304
314
/// Scalar Null > Array > Object > Other Scalars(String > Number > Boolean).
305
315
pub fn compare ( left : & [ u8 ] , right : & [ u8 ] ) -> Result < Ordering , Error > {
306
316
if !is_jsonb ( left) {
307
- let lval = decode_value ( left) . unwrap ( ) ;
317
+ let lval = parse_value ( left) ? ;
308
318
let lbuf = lval. to_vec ( ) ;
309
319
return compare ( & lbuf, right) ;
310
320
} else if !is_jsonb ( right) {
311
- let rval = decode_value ( right) . unwrap ( ) ;
321
+ let rval = parse_value ( right) ? ;
312
322
let rbuf = rval. to_vec ( ) ;
313
323
return compare ( left, & rbuf) ;
314
324
}
@@ -561,15 +571,10 @@ pub fn is_null(value: &[u8]) -> bool {
561
571
/// If the `JSONB` is a Null, returns (). Returns None otherwise.
562
572
pub fn as_null ( value : & [ u8 ] ) -> Option < ( ) > {
563
573
if !is_jsonb ( value) {
564
- if value. is_empty ( ) {
565
- return Some ( ( ) ) ;
566
- }
567
- let v = value. first ( ) . unwrap ( ) ;
568
- if * v == b'n' {
569
- return Some ( ( ) ) ;
570
- } else {
571
- return None ;
572
- }
574
+ return match parse_value ( value) {
575
+ Ok ( val) => val. as_null ( ) ,
576
+ Err ( _) => None ,
577
+ } ;
573
578
}
574
579
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
575
580
match header & CONTAINER_HEADER_TYPE_MASK {
@@ -592,14 +597,10 @@ pub fn is_boolean(value: &[u8]) -> bool {
592
597
/// If the `JSONB` is a Boolean, returns the associated bool. Returns None otherwise.
593
598
pub fn as_bool ( value : & [ u8 ] ) -> Option < bool > {
594
599
if !is_jsonb ( value) {
595
- let v = value. first ( ) . unwrap ( ) ;
596
- if * v == b't' {
597
- return Some ( true ) ;
598
- } else if * v == b'f' {
599
- return Some ( false ) ;
600
- } else {
601
- return None ;
602
- }
600
+ return match parse_value ( value) {
601
+ Ok ( val) => val. as_bool ( ) ,
602
+ Err ( _) => None ,
603
+ } ;
603
604
}
604
605
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
605
606
match header & CONTAINER_HEADER_TYPE_MASK {
@@ -637,8 +638,10 @@ pub fn is_number(value: &[u8]) -> bool {
637
638
/// If the `JSONB` is a Number, returns the Number. Returns None otherwise.
638
639
pub fn as_number ( value : & [ u8 ] ) -> Option < Number > {
639
640
if !is_jsonb ( value) {
640
- let json_value = decode_value ( value) . unwrap ( ) ;
641
- return json_value. as_number ( ) . cloned ( ) ;
641
+ return match parse_value ( value) {
642
+ Ok ( val) => val. as_number ( ) . cloned ( ) ,
643
+ Err ( _) => None ,
644
+ } ;
642
645
}
643
646
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
644
647
match header & CONTAINER_HEADER_TYPE_MASK {
@@ -759,13 +762,13 @@ pub fn is_string(value: &[u8]) -> bool {
759
762
/// If the `JSONB` is a String, returns the String. Returns None otherwise.
760
763
pub fn as_str ( value : & [ u8 ] ) -> Option < Cow < ' _ , str > > {
761
764
if !is_jsonb ( value) {
762
- let v = value . first ( ) . unwrap ( ) ;
763
- if * v == b'"' {
764
- let s = unsafe { std :: str :: from_utf8_unchecked ( & value [ 1 ..value . len ( ) - 1 ] ) } ;
765
- return Some ( Cow :: Borrowed ( s ) ) ;
766
- } else {
767
- return None ;
768
- }
765
+ return match parse_value ( value ) {
766
+ Ok ( val ) => match val {
767
+ Value :: String ( s ) => Some ( s . clone ( ) ) ,
768
+ _ => None ,
769
+ } ,
770
+ Err ( _ ) => None ,
771
+ } ;
769
772
}
770
773
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
771
774
match header & CONTAINER_HEADER_TYPE_MASK {
@@ -787,19 +790,21 @@ pub fn as_str(value: &[u8]) -> Option<Cow<'_, str>> {
787
790
788
791
/// Cast `JSONB` value to String
789
792
pub fn to_str ( value : & [ u8 ] ) -> Result < String , Error > {
790
- if is_null ( value) {
791
- return Err ( Error :: InvalidCast ) ;
792
- } else if let Some ( v) = as_str ( value) {
793
+ if let Some ( v) = as_str ( value) {
793
794
return Ok ( v. to_string ( ) ) ;
795
+ } else if is_null ( value) {
796
+ return Err ( Error :: InvalidCast ) ;
794
797
}
795
798
Ok ( to_string ( value) )
796
799
}
797
800
798
801
/// Returns true if the `JSONB` is An Array. Returns false otherwise.
799
802
pub fn is_array ( value : & [ u8 ] ) -> bool {
800
803
if !is_jsonb ( value) {
801
- let v = value. first ( ) . unwrap ( ) ;
802
- return * v == b'[' ;
804
+ return match parse_value ( value) {
805
+ Ok ( val) => val. is_array ( ) ,
806
+ Err ( _) => false ,
807
+ } ;
803
808
}
804
809
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
805
810
matches ! ( header & CONTAINER_HEADER_TYPE_MASK , ARRAY_CONTAINER_TAG )
@@ -808,8 +813,10 @@ pub fn is_array(value: &[u8]) -> bool {
808
813
/// Returns true if the `JSONB` is An Object. Returns false otherwise.
809
814
pub fn is_object ( value : & [ u8 ] ) -> bool {
810
815
if !is_jsonb ( value) {
811
- let v = value. first ( ) . unwrap ( ) ;
812
- return * v == b'{' ;
816
+ return match parse_value ( value) {
817
+ Ok ( val) => val. is_object ( ) ,
818
+ Err ( _) => false ,
819
+ } ;
813
820
}
814
821
let header = read_u32 ( value, 0 ) . unwrap ( ) ;
815
822
matches ! ( header & CONTAINER_HEADER_TYPE_MASK , OBJECT_CONTAINER_TAG )
@@ -921,7 +928,7 @@ fn scalar_to_string(
921
928
// for compatibility with previous `JSON` string.
922
929
fn is_jsonb ( value : & [ u8 ] ) -> bool {
923
930
if let Some ( v) = value. first ( ) {
924
- if * v == ARRAY_PREFIX || * v == OBJECT_PREFIX || * v == SCALAR_PREFIX {
931
+ if matches ! ( * v , ARRAY_PREFIX | OBJECT_PREFIX | SCALAR_PREFIX ) {
925
932
return true ;
926
933
}
927
934
}
0 commit comments