1414
1515// This file contains functions that specifically operate on JSONB array values.
1616
17- use core:: convert:: TryInto ;
1817use std:: collections:: BTreeMap ;
1918use std:: collections:: BTreeSet ;
2019use std:: collections:: VecDeque ;
@@ -27,8 +26,14 @@ use crate::functions::core::read_u32;
2726use crate :: iterator:: iterate_array;
2827use crate :: jentry:: JEntry ;
2928
29+ use serde:: ser:: SerializeSeq ;
30+ use serde:: Serializer ;
31+
3032use crate :: OwnedJsonb ;
3133use crate :: RawJsonb ;
34+ use crate :: ValueType ;
35+
36+ use crate :: Serializer as JsonbSerializer ;
3237
3338impl OwnedJsonb {
3439 /// Builds a JSONB array from a collection of RawJsonb values.
@@ -72,38 +77,17 @@ impl OwnedJsonb {
7277 /// let result = OwnedJsonb::build_array([invalid_data.as_raw()].into_iter());
7378 /// assert!(result.is_err());
7479 /// ```
75- pub fn build_array < ' a > (
76- items : impl IntoIterator < Item = RawJsonb < ' a > > ,
77- ) -> Result < OwnedJsonb , Error > {
78- let mut jentries = Vec :: new ( ) ;
79- let mut data = Vec :: new ( ) ;
80- for value in items. into_iter ( ) {
81- let header = read_u32 ( value. data , 0 ) ?;
82- let encoded_jentry = match header & CONTAINER_HEADER_TYPE_MASK {
83- SCALAR_CONTAINER_TAG => {
84- let jentry = & value. data [ 4 ..8 ] ;
85- data. extend_from_slice ( & value. data [ 8 ..] ) ;
86- jentry. try_into ( ) . unwrap ( )
87- }
88- ARRAY_CONTAINER_TAG | OBJECT_CONTAINER_TAG => {
89- data. extend_from_slice ( value. data ) ;
90- ( CONTAINER_TAG | value. data . len ( ) as u32 ) . to_be_bytes ( )
91- }
92- _ => return Err ( Error :: InvalidJsonbHeader ) ,
93- } ;
94- jentries. push ( encoded_jentry) ;
80+ pub fn build_array < ' a > ( items : impl IntoIterator < Item = RawJsonb < ' a > > ) -> Result < OwnedJsonb > {
81+ // TODO
82+ let len = 3 ;
83+ let mut serializer = JsonbSerializer :: default ( ) ;
84+ let mut seq = serializer. serialize_seq ( Some ( len) ) ?;
85+
86+ for item in items. into_iter ( ) {
87+ seq. serialize_element ( & item) ?;
9588 }
96- let len = jentries. len ( ) ;
97- // reserve space for header, jentries and value data
98- let mut buf = Vec :: with_capacity ( data. len ( ) + len * 4 + 4 ) ;
99- // write header
100- let header = ARRAY_CONTAINER_TAG | ( len as u32 ) ;
101- buf. extend_from_slice ( & header. to_be_bytes ( ) ) ;
102- // write jentries
103- for jentry in jentries. into_iter ( ) {
104- buf. extend_from_slice ( & jentry) ;
105- }
106- buf. extend_from_slice ( & data) ;
89+ let _ = seq. end ( ) ;
90+ let buf = serializer. buffer . clone ( ) ;
10791 Ok ( OwnedJsonb :: new ( buf) )
10892 }
10993}
@@ -131,19 +115,13 @@ impl RawJsonb<'_> {
131115 /// let len = raw_jsonb.array_length().unwrap();
132116 /// assert_eq!(len, None);
133117 /// ```
134- pub fn array_length ( & self ) -> Result < Option < usize > , Error > {
135- let header = read_u32 ( self . data , 0 ) ?;
136- let len = match header & CONTAINER_HEADER_TYPE_MASK {
137- ARRAY_CONTAINER_TAG => {
138- let length = ( header & CONTAINER_HEADER_LEN_MASK ) as usize ;
139- Some ( length)
140- }
141- OBJECT_CONTAINER_TAG | SCALAR_CONTAINER_TAG => None ,
142- _ => {
143- return Err ( Error :: InvalidJsonb ) ;
144- }
145- } ;
146- Ok ( len)
118+ pub fn array_length ( & self ) -> Result < Option < usize > > {
119+ let value_type = self . value_type ( ) ?;
120+ if let ValueType :: Array ( len) = value_type {
121+ Ok ( Some ( len) )
122+ } else {
123+ Ok ( None )
124+ }
147125 }
148126
149127 /// Extracts the values from a JSONB array.
@@ -193,7 +171,7 @@ impl RawJsonb<'_> {
193171 /// assert!(values_result.is_ok());
194172 /// assert!(values_result.unwrap().is_none());
195173 /// ```
196- pub fn array_values ( & self ) -> Result < Option < Vec < OwnedJsonb > > , Error > {
174+ pub fn array_values ( & self ) -> Result < Option < Vec < OwnedJsonb > > > {
197175 let header = read_u32 ( self . data , 0 ) ?;
198176 match header & CONTAINER_HEADER_TYPE_MASK {
199177 ARRAY_CONTAINER_TAG => {
@@ -269,7 +247,7 @@ impl RawJsonb<'_> {
269247 /// let result = invalid_raw_jsonb.array_distinct();
270248 /// assert!(result.is_err());
271249 /// ```
272- pub fn array_distinct ( & self ) -> Result < OwnedJsonb , Error > {
250+ pub fn array_distinct ( & self ) -> Result < OwnedJsonb > {
273251 let mut buf = Vec :: new ( ) ;
274252 let value = self . data ;
275253 let header = read_u32 ( value, 0 ) ?;
@@ -358,7 +336,7 @@ impl RawJsonb<'_> {
358336 /// let contained = scalar1.as_raw().array_intersection(scalar2.as_raw()).unwrap();
359337 /// assert_eq!(contained.to_string(), "[]"); // Not contained
360338 /// ```
361- pub fn array_intersection ( & self , other : RawJsonb ) -> Result < OwnedJsonb , Error > {
339+ pub fn array_intersection ( & self , other : RawJsonb ) -> Result < OwnedJsonb > {
362340 let mut buf = Vec :: new ( ) ;
363341 let left = self . data ;
364342 let right = other. data ;
@@ -480,7 +458,7 @@ impl RawJsonb<'_> {
480458 /// let not_contained = scalar1.as_raw().array_except(scalar2.as_raw()).unwrap();
481459 /// assert_eq!(not_contained.to_string(), "[1]"); // Not contained
482460 /// ```
483- pub fn array_except ( & self , other : RawJsonb ) -> Result < OwnedJsonb , Error > {
461+ pub fn array_except ( & self , other : RawJsonb ) -> Result < OwnedJsonb > {
484462 let mut buf = Vec :: new ( ) ;
485463 let left = self . data ;
486464 let right = other. data ;
@@ -610,7 +588,7 @@ impl RawJsonb<'_> {
610588 /// let result = invalid_raw_jsonb.array_overlap(arr1.as_raw());
611589 /// assert!(result.is_err()); // Returns an error
612590 /// ```
613- pub fn array_overlap ( & self , other : RawJsonb ) -> Result < bool , Error > {
591+ pub fn array_overlap ( & self , other : RawJsonb ) -> Result < bool > {
614592 let left = self . data ;
615593 let right = other. data ;
616594
@@ -729,7 +707,7 @@ impl RawJsonb<'_> {
729707 /// let inserted = raw_jsonb.array_insert(0, new_raw_jsonb);
730708 /// assert_eq!(inserted.unwrap().to_string(), "[2,1]");
731709 /// ```
732- pub fn array_insert ( & self , pos : i32 , new_val : RawJsonb ) -> Result < OwnedJsonb , Error > {
710+ pub fn array_insert ( & self , pos : i32 , new_val : RawJsonb ) -> Result < OwnedJsonb > {
733711 let mut buf = Vec :: new ( ) ;
734712 let value = self . data ;
735713 let new_value = new_val. data ;
0 commit comments