11use std:: ops:: { Index , Range } ;
22
3- use utils:: range:: { RangeDifference , RangeSet } ;
3+ use utils:: range:: { RangeDifference , RangeSet , ToRangeSet } ;
44
55use crate :: { Span , Spanned } ;
66
@@ -58,19 +58,6 @@ impl JsonValue {
5858 }
5959}
6060
61- impl Spanned < str > for JsonValue {
62- fn span ( & self ) -> & Span < str > {
63- match self {
64- JsonValue :: Null ( v) => v. span ( ) ,
65- JsonValue :: Bool ( v) => v. span ( ) ,
66- JsonValue :: Number ( v) => v. span ( ) ,
67- JsonValue :: String ( v) => v. span ( ) ,
68- JsonValue :: Array ( v) => v. span ( ) ,
69- JsonValue :: Object ( v) => v. span ( ) ,
70- }
71- }
72- }
73-
7461impl JsonValue {
7562 /// Get a reference to the value using the given path.
7663 ///
@@ -98,6 +85,109 @@ impl JsonValue {
9885 }
9986}
10087
88+ impl Spanned < str > for JsonValue {
89+ fn span ( & self ) -> & Span < str > {
90+ match self {
91+ JsonValue :: Null ( v) => v. span ( ) ,
92+ JsonValue :: Bool ( v) => v. span ( ) ,
93+ JsonValue :: Number ( v) => v. span ( ) ,
94+ JsonValue :: String ( v) => v. span ( ) ,
95+ JsonValue :: Array ( v) => v. span ( ) ,
96+ JsonValue :: Object ( v) => v. span ( ) ,
97+ }
98+ }
99+ }
100+
101+ impl AsRef < str > for JsonValue {
102+ fn as_ref ( & self ) -> & str {
103+ match self {
104+ JsonValue :: Null ( v) => v. as_ref ( ) ,
105+ JsonValue :: Bool ( v) => v. as_ref ( ) ,
106+ JsonValue :: Number ( v) => v. as_ref ( ) ,
107+ JsonValue :: String ( v) => v. as_ref ( ) ,
108+ JsonValue :: Array ( v) => v. as_ref ( ) ,
109+ JsonValue :: Object ( v) => v. as_ref ( ) ,
110+ }
111+ }
112+ }
113+
114+ impl AsRef < [ u8 ] > for JsonValue {
115+ fn as_ref ( & self ) -> & [ u8 ] {
116+ match self {
117+ JsonValue :: Null ( v) => v. as_ref ( ) ,
118+ JsonValue :: Bool ( v) => v. as_ref ( ) ,
119+ JsonValue :: Number ( v) => v. as_ref ( ) ,
120+ JsonValue :: String ( v) => v. as_ref ( ) ,
121+ JsonValue :: Array ( v) => v. as_ref ( ) ,
122+ JsonValue :: Object ( v) => v. as_ref ( ) ,
123+ }
124+ }
125+ }
126+
127+ impl AsRef < RangeSet < usize > > for JsonValue {
128+ fn as_ref ( & self ) -> & RangeSet < usize > {
129+ match self {
130+ JsonValue :: Null ( v) => v. as_ref ( ) ,
131+ JsonValue :: Bool ( v) => v. as_ref ( ) ,
132+ JsonValue :: Number ( v) => v. as_ref ( ) ,
133+ JsonValue :: String ( v) => v. as_ref ( ) ,
134+ JsonValue :: Array ( v) => v. as_ref ( ) ,
135+ JsonValue :: Object ( v) => v. as_ref ( ) ,
136+ }
137+ }
138+ }
139+
140+ impl ToRangeSet < usize > for JsonValue {
141+ fn to_range_set ( & self ) -> RangeSet < usize > {
142+ match self {
143+ JsonValue :: Null ( v) => v. to_range_set ( ) ,
144+ JsonValue :: Bool ( v) => v. to_range_set ( ) ,
145+ JsonValue :: Number ( v) => v. to_range_set ( ) ,
146+ JsonValue :: String ( v) => v. to_range_set ( ) ,
147+ JsonValue :: Array ( v) => v. to_range_set ( ) ,
148+ JsonValue :: Object ( v) => v. to_range_set ( ) ,
149+ }
150+ }
151+ }
152+
153+ impl PartialEq < str > for JsonValue {
154+ fn eq ( & self , other : & str ) -> bool {
155+ match self {
156+ JsonValue :: Null ( v) => v == other,
157+ JsonValue :: Bool ( v) => v == other,
158+ JsonValue :: Number ( v) => v == other,
159+ JsonValue :: String ( v) => v == other,
160+ JsonValue :: Array ( v) => v == other,
161+ JsonValue :: Object ( v) => v == other,
162+ }
163+ }
164+ }
165+
166+ impl PartialEq < JsonValue > for str {
167+ fn eq ( & self , other : & JsonValue ) -> bool {
168+ other == self
169+ }
170+ }
171+
172+ impl PartialEq < & str > for JsonValue {
173+ fn eq ( & self , other : & & str ) -> bool {
174+ match self {
175+ JsonValue :: Null ( v) => v == other,
176+ JsonValue :: Bool ( v) => v == other,
177+ JsonValue :: Number ( v) => v == other,
178+ JsonValue :: String ( v) => v == other,
179+ JsonValue :: Array ( v) => v == other,
180+ JsonValue :: Object ( v) => v == other,
181+ }
182+ }
183+ }
184+
185+ impl PartialEq < JsonValue > for & str {
186+ fn eq ( & self , other : & JsonValue ) -> bool {
187+ other == self
188+ }
189+ }
190+
101191/// A key value pair in a JSON object.
102192#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
103193#[ cfg_attr( feature = "serde" , derive( serde:: Serialize , serde:: Deserialize ) ) ]
@@ -266,6 +356,30 @@ macro_rules! impl_type {
266356 }
267357 }
268358
359+ impl AsRef <str > for $ty {
360+ fn as_ref( & self ) -> & str {
361+ self . $span. as_ref( )
362+ }
363+ }
364+
365+ impl AsRef <[ u8 ] > for $ty {
366+ fn as_ref( & self ) -> & [ u8 ] {
367+ self . $span. as_ref( )
368+ }
369+ }
370+
371+ impl AsRef <RangeSet <usize >> for $ty {
372+ fn as_ref( & self ) -> & RangeSet <usize > {
373+ & self . $span. indices
374+ }
375+ }
376+
377+ impl ToRangeSet <usize > for $ty {
378+ fn to_range_set( & self ) -> RangeSet <usize > {
379+ self . $span. indices. clone( )
380+ }
381+ }
382+
269383 impl PartialEq <str > for $ty {
270384 fn eq( & self , other: & str ) -> bool {
271385 self . $span == other
@@ -339,7 +453,7 @@ mod tests {
339453
340454 let value = parse_str ( src) . unwrap ( ) ;
341455
342- assert_eq ! ( value. get( "foo" ) . unwrap( ) . span ( ) , "bar" ) ;
456+ assert_eq ! ( value. get( "foo" ) . unwrap( ) , "bar" ) ;
343457 }
344458
345459 #[ test]
@@ -348,7 +462,7 @@ mod tests {
348462
349463 let value = parse_str ( src) . unwrap ( ) ;
350464
351- assert_eq ! ( value. get( "foo.1" ) . unwrap( ) . span ( ) , "14" ) ;
465+ assert_eq ! ( value. get( "foo.1" ) . unwrap( ) , "14" ) ;
352466 }
353467
354468 #[ test]
@@ -357,7 +471,7 @@ mod tests {
357471
358472 let value = parse_str ( src) . unwrap ( ) ;
359473
360- assert_eq ! ( value. get( "foo.bar.1" ) . unwrap( ) . span ( ) , "14" ) ;
474+ assert_eq ! ( value. get( "foo.bar.1" ) . unwrap( ) , "14" ) ;
361475 }
362476
363477 #[ test]
0 commit comments