@@ -4,31 +4,25 @@ use nom::{
4
4
branch:: alt,
5
5
bytes:: complete:: { escaped, tag, take_while} ,
6
6
character:: complete:: { alphanumeric1 as alphanumeric, char, one_of} ,
7
- combinator:: { map, opt, cut} ,
8
- error:: { context, ErrorKind , ParseError } ,
9
- error:: { VerboseError , VerboseErrorKind } ,
10
- multi:: separated_list,
7
+ combinator:: { cut, map} ,
8
+ error:: { context, ParseError } ,
9
+ multi:: separated_list0,
11
10
number:: complete:: double,
12
- sequence:: { delimited , preceded, separated_pair, terminated} ,
13
- Err , IResult , Offset ,
11
+ sequence:: { preceded, separated_pair, terminated} ,
12
+ IResult ,
14
13
} ;
15
14
use std:: collections:: HashMap ;
16
15
17
- use std:: str;
18
16
use std:: cell:: Cell ;
19
-
20
- struct Cursor < ' a > {
21
- inner : & ' a str ,
22
- offset : usize ,
23
- }
17
+ use std:: str;
24
18
25
19
#[ derive( Clone , Debug ) ]
26
20
pub struct JsonValue < ' a , ' b > {
27
21
input : & ' a str ,
28
22
pub offset : & ' b Cell < usize > ,
29
23
}
30
24
31
- impl < ' a , ' b : ' a > JsonValue < ' a , ' b > {
25
+ impl < ' a , ' b : ' a > JsonValue < ' a , ' b > {
32
26
pub fn new ( input : & ' a str , offset : & ' b Cell < usize > ) -> JsonValue < ' a , ' b > {
33
27
JsonValue { input, offset }
34
28
}
@@ -49,7 +43,7 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
49
43
self . offset ( i) ;
50
44
println ! ( "-> {}" , s) ;
51
45
Some ( s)
52
- } ,
46
+ }
53
47
_ => None ,
54
48
}
55
49
}
@@ -61,27 +55,27 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
61
55
self . offset ( i) ;
62
56
println ! ( "-> {}" , o) ;
63
57
Some ( o)
64
- } ,
58
+ }
65
59
_ => None ,
66
60
}
67
61
}
68
62
69
63
pub fn number ( & self ) -> Option < f64 > {
70
64
println ! ( "number()" ) ;
71
- match double :: < _ , ( ) > ( self . data ( ) ) {
65
+ match double :: < _ , ( ) > ( self . data ( ) ) {
72
66
Ok ( ( i, o) ) => {
73
67
self . offset ( i) ;
74
68
println ! ( "-> {}" , o) ;
75
69
Some ( o)
76
- } ,
70
+ }
77
71
_ => None ,
78
72
}
79
73
}
80
74
81
- pub fn array ( & self ) -> Option < impl Iterator < Item = JsonValue < ' a , ' b > > > {
75
+ pub fn array ( & self ) -> Option < impl Iterator < Item = JsonValue < ' a , ' b > > > {
82
76
println ! ( "array()" ) ;
83
77
84
- match tag :: < _ , _ , ( ) > ( "[" ) ( self . data ( ) ) {
78
+ match tag :: < _ , _ , ( ) > ( "[" ) ( self . data ( ) ) {
85
79
Err ( _) => None ,
86
80
Ok ( ( i, _) ) => {
87
81
println ! ( "[" ) ;
@@ -92,7 +86,7 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
92
86
93
87
let v = self . clone ( ) ;
94
88
95
- Some ( std:: iter:: from_fn ( move || {
89
+ Some ( std:: iter:: from_fn ( move || {
96
90
if done {
97
91
return None ;
98
92
}
@@ -103,30 +97,29 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
103
97
match value ( v. data ( ) ) {
104
98
Ok ( ( i, _) ) => {
105
99
v. offset ( i) ;
106
- } ,
107
- Err ( _) => { } ,
100
+ }
101
+ Err ( _) => { }
108
102
}
109
103
}
110
104
111
-
112
- match tag :: < _ , _ , ( ) > ( "]" ) ( v. data ( ) ) {
105
+ match tag :: < _ , _ , ( ) > ( "]" ) ( v. data ( ) ) {
113
106
Ok ( ( i, _) ) => {
114
107
println ! ( "]" ) ;
115
108
v. offset ( i) ;
116
109
done = true ;
117
110
return None ;
118
- } ,
111
+ }
119
112
Err ( _) => { }
120
113
} ;
121
114
122
115
if first {
123
116
first = false ;
124
117
} else {
125
- match tag :: < _ , _ , ( ) > ( "," ) ( v. data ( ) ) {
118
+ match tag :: < _ , _ , ( ) > ( "," ) ( v. data ( ) ) {
126
119
Ok ( ( i, _) ) => {
127
- println ! ( "," ) ;
120
+ println ! ( "," ) ;
128
121
v. offset ( i) ;
129
- } ,
122
+ }
130
123
Err ( _) => {
131
124
done = true ;
132
125
return None ;
@@ -137,15 +130,14 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
137
130
println ! ( "-> {}" , v. data( ) ) ;
138
131
previous = v. offset . get ( ) ;
139
132
Some ( v. clone ( ) )
140
-
141
133
} ) )
142
134
}
143
135
}
144
136
}
145
137
146
- pub fn object ( & self ) -> Option < impl Iterator < Item = ( & ' a str , JsonValue < ' a , ' b > ) > > {
138
+ pub fn object ( & self ) -> Option < impl Iterator < Item = ( & ' a str , JsonValue < ' a , ' b > ) > > {
147
139
println ! ( "object()" ) ;
148
- match tag :: < _ , _ , ( ) > ( "{" ) ( self . data ( ) ) {
140
+ match tag :: < _ , _ , ( ) > ( "{" ) ( self . data ( ) ) {
149
141
Err ( _) => None ,
150
142
Ok ( ( i, _) ) => {
151
143
self . offset ( i) ;
@@ -158,7 +150,7 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
158
150
159
151
let v = self . clone ( ) ;
160
152
161
- Some ( std:: iter:: from_fn ( move || {
153
+ Some ( std:: iter:: from_fn ( move || {
162
154
if done {
163
155
return None ;
164
156
}
@@ -169,29 +161,29 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
169
161
match value ( v. data ( ) ) {
170
162
Ok ( ( i, _) ) => {
171
163
v. offset ( i) ;
172
- } ,
173
- Err ( _) => { } ,
164
+ }
165
+ Err ( _) => { }
174
166
}
175
167
}
176
168
177
- match tag :: < _ , _ , ( ) > ( "}" ) ( v. data ( ) ) {
169
+ match tag :: < _ , _ , ( ) > ( "}" ) ( v. data ( ) ) {
178
170
Ok ( ( i, _) ) => {
179
171
println ! ( "}}" ) ;
180
172
v. offset ( i) ;
181
173
done = true ;
182
174
return None ;
183
- } ,
175
+ }
184
176
Err ( _) => { }
185
177
} ;
186
178
187
179
if first {
188
180
first = false ;
189
181
} else {
190
- match tag :: < _ , _ , ( ) > ( "," ) ( v. data ( ) ) {
182
+ match tag :: < _ , _ , ( ) > ( "," ) ( v. data ( ) ) {
191
183
Ok ( ( i, _) ) => {
192
184
println ! ( "," ) ;
193
185
v. offset ( i) ;
194
- } ,
186
+ }
195
187
Err ( _) => {
196
188
done = true ;
197
189
return None ;
@@ -203,7 +195,7 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
203
195
Ok ( ( i, key) ) => {
204
196
v. offset ( i) ;
205
197
206
- match tag :: < _ , _ , ( ) > ( ":" ) ( v. data ( ) ) {
198
+ match tag :: < _ , _ , ( ) > ( ":" ) ( v. data ( ) ) {
207
199
Err ( _) => None ,
208
200
Ok ( ( i, _) ) => {
209
201
v. offset ( i) ;
@@ -214,10 +206,9 @@ impl<'a, 'b:'a> JsonValue<'a, 'b> {
214
206
Some ( ( key, v. clone ( ) ) )
215
207
}
216
208
}
217
- } ,
209
+ }
218
210
_ => None ,
219
211
}
220
-
221
212
} ) )
222
213
}
223
214
}
@@ -235,47 +226,44 @@ fn parse_str<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str
235
226
}
236
227
237
228
fn string < ' a > ( i : & ' a str ) -> IResult < & ' a str , & ' a str > {
238
- context ( "string" ,
239
- preceded (
240
- char ( '\"' ) ,
241
- cut ( terminated (
242
- parse_str,
243
- char ( '\"' )
244
- ) ) ) ) ( i)
229
+ context (
230
+ "string" ,
231
+ preceded ( char ( '\"' ) , cut ( terminated ( parse_str, char ( '\"' ) ) ) ) ,
232
+ ) ( i)
245
233
}
246
234
247
235
fn boolean < ' a > ( input : & ' a str ) -> IResult < & ' a str , bool > {
248
- alt ( (
249
- map ( tag ( "false" ) , |_| false ) ,
250
- map ( tag ( "true" ) , |_| true )
251
- ) ) ( input)
236
+ alt ( ( map ( tag ( "false" ) , |_| false ) , map ( tag ( "true" ) , |_| true ) ) ) ( input)
252
237
}
253
238
254
239
fn array < ' a > ( i : & ' a str ) -> IResult < & ' a str , ( ) > {
255
240
context (
256
241
"array" ,
257
- preceded ( char ( '[' ) ,
258
- cut ( terminated (
259
- map ( separated_list ( preceded ( sp, char ( ',' ) ) , value) , |_| ( ) ) ,
260
- preceded ( sp, char ( ']' ) ) ) )
261
- ) ) ( i)
242
+ preceded (
243
+ char ( '[' ) ,
244
+ cut ( terminated (
245
+ map ( separated_list0 ( preceded ( sp, char ( ',' ) ) , value) , |_| ( ) ) ,
246
+ preceded ( sp, char ( ']' ) ) ,
247
+ ) ) ,
248
+ ) ,
249
+ ) ( i)
262
250
}
263
251
264
252
fn key_value < ' a > ( i : & ' a str ) -> IResult < & ' a str , ( & ' a str , ( ) ) > {
265
- separated_pair ( preceded ( sp, string) , cut ( preceded ( sp, char ( ':' ) ) ) , value) ( i)
253
+ separated_pair ( preceded ( sp, string) , cut ( preceded ( sp, char ( ':' ) ) ) , value) ( i)
266
254
}
267
255
268
256
fn hash < ' a > ( i : & ' a str ) -> IResult < & ' a str , ( ) > {
269
257
context (
270
258
"map" ,
271
- preceded ( char ( '{' ) ,
272
- cut ( terminated (
273
- map (
274
- separated_list ( preceded ( sp, char ( ',' ) ) , key_value) ,
275
- |_| ( ) ) ,
276
- preceded ( sp , char ( '}' ) ) ,
277
- ) )
278
- ) ) ( i)
259
+ preceded (
260
+ char ( '{' ) ,
261
+ cut ( terminated (
262
+ map ( separated_list0 ( preceded ( sp, char ( ',' ) ) , key_value) , |_| ( ) ) ,
263
+ preceded ( sp , char ( '}' ) ) ,
264
+ ) ) ,
265
+ ) ,
266
+ ) ( i)
279
267
}
280
268
281
269
fn value < ' a > ( i : & ' a str ) -> IResult < & ' a str , ( ) > {
@@ -314,13 +302,17 @@ fn main() {
314
302
let parser = JsonValue :: new ( data, & offset) ;
315
303
316
304
if let Some ( o) = parser. object ( ) {
317
- let s: HashMap < & str , & str > = o. filter ( |( k, _) | * k == "users" )
318
- . filter_map ( |( _, v) | v. object ( ) ) . flatten ( )
319
- . filter_map ( |( user, v) | v. object ( ) . map ( |o| ( user, o) ) )
320
- . map ( |( user, o) | {
321
- o. filter ( |( k, _) | * k == "city" )
322
- . filter_map ( move |( _, v) | v. string ( ) . map ( |s| ( user, s) ) )
323
- } ) . flatten ( ) . collect ( ) ;
305
+ let s: HashMap < & str , & str > = o
306
+ . filter ( |( k, _) | * k == "users" )
307
+ . filter_map ( |( _, v) | v. object ( ) )
308
+ . flatten ( )
309
+ . filter_map ( |( user, v) | v. object ( ) . map ( |o| ( user, o) ) )
310
+ . map ( |( user, o) | {
311
+ o. filter ( |( k, _) | * k == "city" )
312
+ . filter_map ( move |( _, v) | v. string ( ) . map ( |s| ( user, s) ) )
313
+ } )
314
+ . flatten ( )
315
+ . collect ( ) ;
324
316
325
317
println ! ( "res = {:?}" , s) ;
326
318
}
0 commit comments