44//! Lightweight string-keyed map used during normalization/denormalization.
55//!
66//! Internally uses `hashbrown::HashMap<Rc<str>, Value>` for O(1) lookups,
7- //! then converts to `Value::Object` (a `BTreeMap<Value, Value> `) only at
7+ //! then converts to `Value::Object` (an `Object `) only at
88//! the output boundary via [`make_value`].
99
1010use alloc:: string:: String ;
1111use alloc:: vec:: Vec ;
1212
1313use hashbrown:: HashMap ;
1414
15+ use crate :: collections:: Object ;
1516use crate :: Rc ;
1617use crate :: Value ;
1718
@@ -81,14 +82,13 @@ pub fn obj_remove(map: &mut ObjMap, key: &str) -> Option<Value> {
8182/// Convert an [`ObjMap`] into a [`Value::Object`].
8283///
8384/// Keys are converted from `Rc<str>` to `Value::String` and inserted into
84- /// a `BTreeMap ` to match the `Value::Object` representation.
85+ /// an `Object ` to match the `Value::Object` representation.
8586pub fn make_value ( map : ObjMap ) -> Value {
86- use alloc:: collections:: BTreeMap ;
87- let mut btree = BTreeMap :: new ( ) ;
88- for ( k, v) in map {
89- btree. insert ( Value :: String ( k) , v) ;
90- }
91- Value :: Object ( Rc :: new ( btree) )
87+ let obj: Object = map
88+ . into_iter ( )
89+ . map ( |( k, v) | ( Value :: String ( k) , v) )
90+ . collect ( ) ;
91+ Value :: Object ( Rc :: new ( obj) )
9292}
9393
9494/// Convert a `Vec<Value>` into a `Value::Array`.
@@ -115,14 +115,14 @@ pub fn extract_type_field(resource: &Value) -> Option<&str> {
115115 } )
116116}
117117
118- /// Convert a `Value::Object` (BTreeMap<Value, Value> ) into an [`ObjMap`].
118+ /// Convert a `Value::Object` (Object ) into an [`ObjMap`].
119119///
120120/// Non-string keys are silently skipped.
121121#[ allow( dead_code) ]
122122pub fn value_to_obj_map ( value : & Value ) -> Option < ObjMap > {
123- let btree = value. as_object ( ) . ok ( ) ?;
124- let mut map = ObjMap :: with_capacity ( btree . len ( ) ) ;
125- for ( k, v) in btree . iter ( ) {
123+ let obj = value. as_object ( ) . ok ( ) ?;
124+ let mut map = ObjMap :: with_capacity ( obj . len ( ) ) ;
125+ for ( k, v) in obj . iter ( ) {
126126 if let Value :: String ( s) = k {
127127 map. insert ( Rc :: clone ( s) , v. clone ( ) ) ;
128128 }
@@ -203,17 +203,12 @@ fn set_nested_inner(obj: &mut ObjMap, segments: &[&str], value: Value, lowercase
203203 }
204204}
205205
206- /// Set a value at a path directly in a `BTreeMap<Value, Value> `, creating
206+ /// Set a value at a path directly in an `Object `, creating
207207/// intermediate `Value::Object` nodes as needed.
208208///
209209/// This avoids the `btree_to_obj_map` / `obj_map_to_btree` round-trip that
210210/// would clone every sibling entry at each nesting level.
211- pub fn set_nested_in_btree (
212- btree : & mut alloc:: collections:: BTreeMap < Value , Value > ,
213- segments : & [ & str ] ,
214- value : Value ,
215- lowercase : bool ,
216- ) {
211+ pub fn set_nested_in_btree ( obj : & mut Object , segments : & [ & str ] , value : Value , lowercase : bool ) {
217212 let Some ( & first) = segments. first ( ) else {
218213 return ;
219214 } ;
@@ -226,16 +221,16 @@ pub fn set_nested_in_btree(
226221 let key_val = Value :: String ( Rc :: clone ( & key_rc) ) ;
227222
228223 if segments. len ( ) == 1 {
229- btree . insert ( key_val, value) ;
224+ obj . insert ( key_val, value) ;
230225 return ;
231226 }
232227
233228 // Ensure an intermediate object exists.
234- if !btree . contains_key ( & key_val) {
235- btree . insert ( key_val. clone ( ) , make_value ( new_map ( ) ) ) ;
229+ if !obj . contains_key ( & key_val) {
230+ obj . insert ( key_val. clone ( ) , make_value ( new_map ( ) ) ) ;
236231 }
237232
238- if let Some ( Value :: Object ( inner_rc) ) = btree . get_mut ( & key_val) {
233+ if let Some ( Value :: Object ( inner_rc) ) = obj . get_mut ( & key_val) {
239234 let inner = Rc :: make_mut ( inner_rc) ;
240235 set_nested_in_btree (
241236 inner,
@@ -363,9 +358,9 @@ fn remove_field_at_depth(obj: &mut ObjMap, array_chain: &[Vec<String>], depth: u
363358 }
364359}
365360
366- /// BTreeMap -native recursion for element-level field removal.
361+ /// Object -native recursion for element-level field removal.
367362fn remove_field_at_depth_in_btree (
368- btree : & mut alloc :: collections :: BTreeMap < Value , Value > ,
363+ obj : & mut Object ,
369364 array_chain : & [ Vec < String > ] ,
370365 depth : usize ,
371366 field : & str ,
@@ -374,10 +369,10 @@ fn remove_field_at_depth_in_btree(
374369 let segments: Vec < & str > = field. split ( '.' ) . collect ( ) ;
375370 if segments. len ( ) == 1 {
376371 if let Some ( & seg) = segments. first ( ) {
377- btree . remove ( & Value :: from ( seg) ) ;
372+ obj . remove ( & Value :: from ( seg) ) ;
378373 }
379374 } else if segments. len ( ) > 1 {
380- remove_at_dotted_path_in_btree ( btree , & segments) ;
375+ remove_at_dotted_path_in_btree ( obj , & segments) ;
381376 }
382377 return ;
383378 } ;
@@ -389,12 +384,12 @@ fn remove_field_at_depth_in_btree(
389384
390385 let key_val = Value :: from ( first) ;
391386 let arr_val = if nav. len ( ) == 1 {
392- match btree . get_mut ( & key_val) {
387+ match obj . get_mut ( & key_val) {
393388 Some ( v) => v,
394389 None => return ,
395390 }
396391 } else {
397- let mut cur: & mut Value = match btree . get_mut ( & key_val) {
392+ let mut cur: & mut Value = match obj . get_mut ( & key_val) {
398393 Some ( v) => v,
399394 None => return ,
400395 } ;
@@ -426,24 +421,21 @@ fn remove_field_at_depth_in_btree(
426421 }
427422}
428423
429- /// Remove the leaf segment at a dotted path directly in a BTreeMap.
430- fn remove_at_dotted_path_in_btree (
431- btree : & mut alloc:: collections:: BTreeMap < Value , Value > ,
432- segments : & [ & str ] ,
433- ) {
424+ /// Remove the leaf segment at a dotted path directly in an Object.
425+ fn remove_at_dotted_path_in_btree ( obj : & mut Object , segments : & [ & str ] ) {
434426 let Some ( ( & leaf, parent_segs) ) = segments. split_last ( ) else {
435427 return ;
436428 } ;
437429 if parent_segs. is_empty ( ) {
438- btree . remove ( & Value :: from ( leaf) ) ;
430+ obj . remove ( & Value :: from ( leaf) ) ;
439431 return ;
440432 }
441433
442434 let Some ( & first) = parent_segs. first ( ) else {
443435 return ;
444436 } ;
445437 let first_key = Value :: from ( first) ;
446- let parent_val = match btree . get_mut ( & first_key) {
438+ let parent_val = match obj . get_mut ( & first_key) {
447439 Some ( v) => v,
448440 None => return ,
449441 } ;
0 commit comments