11use serde_json;
22use serde_json:: Map ;
33use serde_json:: Value ;
4+ use std:: collections:: BTreeSet ;
45
56fn main ( ) {
67 let data = r#"{
@@ -55,44 +56,47 @@ fn main() {
5556 }
5657}
5758
59+ #[ derive( Eq , PartialEq , Ord , PartialOrd , Debug ) ]
60+ struct KeyMap {
61+ key : String ,
62+ children : Option < BTreeSet < KeyMap > > ,
63+ }
64+
5865enum Mismatch {
5966 NoMismatch ,
6067 ValueMismatch ,
61- ObjectMismatch ( Option < Vec < String > > , Option < Vec < String > > , Option < Vec < String > > ) ,
68+ ObjectMismatch ( Option < BTreeSet < KeyMap > > , Option < BTreeSet < KeyMap > > , Option < BTreeSet < KeyMap > > ) ,
6269}
6370
6471fn match_json ( value : & Value , value1 : & Value ) -> Mismatch {
6572 match ( value, value1) {
6673 ( Value :: Object ( a) , Value :: Object ( b) ) => {
67- let ( mut left, mut right, intersection) = intersect_maps ( & a, & b) ;
68- let mut unequal_keys = vec ! [ ] ;
74+ let ( left, right, intersection) = intersect_maps ( & a, & b) ;
75+ let mut unequal_keys = BTreeSet :: new ( ) ;
76+
77+ let mut left = left. iter ( ) . map ( |x| KeyMap { key : String :: from ( x) , children : None } ) . collect :: < BTreeSet < KeyMap > > ( ) ;
78+ let mut right = right. iter ( ) . map ( |x| KeyMap { key : String :: from ( x) , children : None } ) . collect :: < BTreeSet < KeyMap > > ( ) ;
6979
7080 for key in intersection {
71- let append_key = |x : & String | {
72- let mut n = String :: from ( & key) ;
73- n. push ( '.' ) ;
74- n. push_str ( x) ;
75- n. to_string ( )
76- } ;
7781 let x = match_json ( & a. get ( & key) . unwrap ( ) , & b. get ( & key) . unwrap ( ) ) ;
78- if let Some ( mut keys) = match x {
82+ if let Some ( keys) = match x {
7983 Mismatch :: NoMismatch => None ,
80- Mismatch :: ValueMismatch => Some ( vec ! [ key] ) ,
84+ Mismatch :: ValueMismatch => Some ( KeyMap { key, children : None } ) ,
8185 Mismatch :: ObjectMismatch ( left_keys, right_keys, mismatch_keys) => {
8286 if let Some ( left_keys) = left_keys {
83- left. append ( & mut left_keys . iter ( ) . map ( append_key ) . collect :: < Vec < String > > ( ) ) ;
87+ left. insert ( KeyMap { key : String :: from ( & key ) , children : Some ( left_keys ) } ) ;
8488 }
8589 if let Some ( right_keys) = right_keys {
86- right. append ( & mut right_keys . iter ( ) . map ( append_key ) . collect :: < Vec < String > > ( ) ) ;
90+ right. insert ( KeyMap { key : String :: from ( & key ) , children : Some ( right_keys ) } ) ;
8791 }
8892 if let Some ( mismatch_keys) = mismatch_keys {
89- Some ( mismatch_keys . iter ( ) . map ( append_key ) . collect :: < Vec < String > > ( ) )
93+ Some ( KeyMap { key : String :: from ( & key ) , children : Some ( mismatch_keys ) } )
9094 } else {
9195 None
9296 }
9397 } ,
9498 } {
95- unequal_keys. append ( & mut keys) ;
99+ unequal_keys. insert ( keys) ;
96100 }
97101 }
98102 Mismatch :: ObjectMismatch ( Some ( left) , Some ( right) , Some ( unequal_keys) )
@@ -108,21 +112,21 @@ fn match_json(value: &Value, value1: &Value) -> Mismatch {
108112}
109113
110114fn intersect_maps < ' a > ( a : & Map < String , Value > ,
111- b : & Map < String , Value > ) -> ( Vec < String > ,
112- Vec < String > , Vec < String > ) {
113- let mut intersection = vec ! [ ] ;
114- let mut left = vec ! [ ] ;
115- let mut right = vec ! [ ] ;
115+ b : & Map < String , Value > ) -> ( BTreeSet < String > ,
116+ BTreeSet < String > , BTreeSet < String > ) {
117+ let mut intersection = BTreeSet :: new ( ) ;
118+ let mut left = BTreeSet :: new ( ) ;
119+ let mut right = BTreeSet :: new ( ) ;
116120 for a_key in a. keys ( ) {
117121 if b. contains_key ( a_key) {
118- intersection. push ( String :: from ( a_key) ) ;
122+ intersection. insert ( String :: from ( a_key) ) ;
119123 } else {
120- left. push ( String :: from ( a_key) ) ;
124+ left. insert ( String :: from ( a_key) ) ;
121125 }
122126 }
123127 for b_key in b. keys ( ) {
124128 if !a. contains_key ( b_key) {
125- right. push ( String :: from ( b_key) ) ;
129+ right. insert ( String :: from ( b_key) ) ;
126130 }
127131 }
128132 ( left, right, intersection)
0 commit comments