1
- use nom:: IResult ;
1
+ use nom;
2
2
use super :: { Error , Result } ;
3
3
4
4
#[ derive( Clone , Debug , PartialEq ) ]
@@ -51,7 +51,7 @@ pub enum Expr {
51
51
}
52
52
53
53
use std:: str;
54
- named ! (
54
+ named_complete ! (
55
55
op<Result <Op >>,
56
56
alt!(
57
57
alt!( tag!( "+" ) | tag!( "add" ) ) => { |_| Ok ( Op :: Add ) } |
@@ -90,7 +90,7 @@ fn check_expr(op: Op, left: Expr, right: Expr) -> Result<Expr> {
90
90
}
91
91
92
92
use nom:: multispace;
93
- named ! (
93
+ named_complete ! (
94
94
sexp<Result <Expr >>,
95
95
ws!( delimited!(
96
96
tag!( "(" ) ,
@@ -111,26 +111,25 @@ named!(
111
111
) ;
112
112
113
113
use nom:: digit;
114
+ use nom:: types:: CompleteByteSlice ;
114
115
use std:: str:: FromStr ;
115
- named ! (
116
+ named_complete ! (
116
117
pub num<u64 >,
117
118
map_res!(
118
- map_res!( digit, str :: from_utf8) ,
119
- FromStr :: from_str
119
+ digit,
120
+ |d: CompleteByteSlice | {
121
+ let st = str :: from_utf8( d. 0 ) ?;
122
+ FromStr :: from_str( st) . map_err( Error :: from)
123
+ }
120
124
)
121
125
) ;
122
126
123
127
use nom:: is_alphanumeric;
124
- named ! (
125
- name_raw<& [ u8 ] >,
126
- take_while1!( |u: u8 | is_alphanumeric( u) || u == b'.' || u == b'_' )
127
- ) ;
128
-
129
- named ! (
128
+ named_complete ! (
130
129
pub name<String >,
131
130
map_res!(
132
- name_raw ,
133
- |n: & [ u8 ] | str :: from_utf8( n) . map_err( Error :: from) . and_then( |s|
131
+ take_while1! ( |u : u8 | is_alphanumeric ( u ) || u == b'.' || u == b'_' ) ,
132
+ |n: CompleteByteSlice | str :: from_utf8( n. 0 ) . map_err( Error :: from) . and_then( |s|
134
133
if s. starts_with( "__" ) {
135
134
Err ( Error :: from(
136
135
format!( "Names beginning with \" __\" are reserved for internal use: {:?}" , s) ,
@@ -142,7 +141,7 @@ named!(
142
141
)
143
142
) ;
144
143
145
- named ! (
144
+ named_complete ! (
146
145
pub atom<Result <Expr >>,
147
146
ws!( do_parse!(
148
147
val: alt!(
@@ -156,7 +155,7 @@ named!(
156
155
) )
157
156
) ;
158
157
159
- named ! (
158
+ named_complete ! (
160
159
command<Result <Expr >>,
161
160
ws!( delimited!(
162
161
tag!( "(" ) ,
@@ -171,7 +170,7 @@ named!(
171
170
) )
172
171
) ;
173
172
174
- named ! (
173
+ named_complete ! (
175
174
pub comment<Result <Expr >>,
176
175
ws!( do_parse!(
177
176
tag!( "#" ) >>
@@ -180,12 +179,12 @@ named!(
180
179
) )
181
180
) ;
182
181
183
- named ! (
182
+ named_complete ! (
184
183
pub expr<Result <Expr >>,
185
184
alt_complete!( comment | sexp | command | atom)
186
185
) ;
187
186
188
- named ! (
187
+ named_complete ! (
189
188
pub exprs<Vec <Result <Expr >>>,
190
189
many1!( expr)
191
190
) ;
@@ -194,14 +193,15 @@ impl Expr {
194
193
// TODO make return Iter
195
194
pub fn new ( src : & [ u8 ] ) -> Result < Vec < Self > > {
196
195
use nom:: Needed ;
197
- match exprs ( src) {
198
- IResult :: Done ( _, me) => me. into_iter ( ) . filter ( |e| match e {
196
+ match exprs ( CompleteByteSlice ( src) ) {
197
+ Ok ( ( _, me) ) => me. into_iter ( ) . filter ( |e| match e {
199
198
Ok ( Expr :: None ) => false ,
200
199
_ => true ,
201
200
} ) . collect ( ) ,
202
- IResult :: Error ( e) => Err ( Error :: from ( e) ) ,
203
- IResult :: Incomplete ( Needed :: Unknown ) => Err ( Error :: from ( "need more src" ) ) ,
204
- IResult :: Incomplete ( Needed :: Size ( s) ) => Err (
201
+ Err ( nom:: Err :: Error ( e) ) |
202
+ Err ( nom:: Err :: Failure ( e) ) => Err ( Error :: from ( e) ) ,
203
+ Err ( nom:: Err :: Incomplete ( Needed :: Unknown ) ) => Err ( Error :: from ( "need more src" ) ) ,
204
+ Err ( nom:: Err :: Incomplete ( Needed :: Size ( s) ) ) => Err (
205
205
Error :: from ( format ! ( "need {} more bytes" , s) ) ,
206
206
) ,
207
207
}
@@ -235,47 +235,77 @@ impl Expr {
235
235
236
236
#[ cfg( test) ]
237
237
mod tests {
238
+ use nom:: types:: CompleteByteSlice ;
238
239
use super :: { Command , Expr , Op , Prim } ;
239
240
240
241
#[ test]
241
- fn atom ( ) {
242
+ fn atom_0 ( ) {
243
+ use super :: name;
244
+ let foo = b"foo" ;
245
+ let er = name ( CompleteByteSlice ( foo) ) ;
246
+ println ! ( "{:?}" , er. expect( "parse single atom" ) ) ;
247
+ }
248
+
249
+ #[ test]
250
+ fn atom_1 ( ) {
242
251
let foo = b"1" ;
243
252
let er = Expr :: new ( foo) ;
244
253
let e = er. unwrap ( ) ;
245
254
assert_eq ! ( e, vec![ Expr :: Atom ( Prim :: Num ( 1 ) ) ] ) ;
246
-
255
+ }
256
+
257
+ #[ test]
258
+ fn atom_2 ( ) {
247
259
let foo = b"1 " ;
248
260
let er = Expr :: new ( foo) ;
249
261
let e = er. unwrap ( ) ;
250
262
assert_eq ! ( e, vec![ Expr :: Atom ( Prim :: Num ( 1 ) ) ] ) ;
263
+ }
251
264
265
+ #[ test]
266
+ fn atom_3 ( ) {
252
267
let foo = b"+" ;
253
268
let er = Expr :: new ( foo) ;
254
269
match er {
255
270
Ok ( e) => panic ! ( "false ok: {:?}" , e) ,
256
271
Err ( _) => ( ) ,
257
272
}
273
+ }
258
274
275
+ #[ test]
276
+ fn atom_4 ( ) {
259
277
let foo = b"true" ;
260
278
let er = Expr :: new ( foo) ;
261
279
let e = er. unwrap ( ) ;
262
280
assert_eq ! ( e, vec![ Expr :: Atom ( Prim :: Bool ( true ) ) ] ) ;
281
+ }
263
282
283
+ #[ test]
284
+ fn atom_5 ( ) {
264
285
let foo = b"false" ;
265
286
let er = Expr :: new ( foo) ;
266
287
let e = er. unwrap ( ) ;
267
288
assert_eq ! ( e, vec![ Expr :: Atom ( Prim :: Bool ( false ) ) ] ) ;
289
+ }
268
290
291
+ #[ test]
292
+ fn atom_6 ( ) {
269
293
let foo = b"x" ;
270
294
let er = Expr :: new ( foo) ;
271
295
let e = er. unwrap ( ) ;
272
296
assert_eq ! ( e, vec![ Expr :: Atom ( Prim :: Name ( String :: from( "x" ) ) ) ] ) ;
297
+ }
273
298
299
+ #[ test]
300
+ fn atom_7 ( ) {
274
301
let foo = b"acbdefg" ;
275
302
let er = Expr :: new ( foo) ;
276
303
let e = er. unwrap ( ) ;
277
304
assert_eq ! ( e, vec![ Expr :: Atom ( Prim :: Name ( String :: from( "acbdefg" ) ) ) ] ) ;
278
-
305
+ }
306
+
307
+ #[ test]
308
+ fn atom_8 ( ) {
279
309
let foo = b"blah 10 20" ;
280
310
let er = Expr :: new ( foo) ;
281
311
let e = er. unwrap ( ) ;
@@ -288,7 +318,7 @@ mod tests {
288
318
]
289
319
) ;
290
320
}
291
-
321
+
292
322
#[ test]
293
323
fn simple_exprs ( ) {
294
324
let foo = b"(+ 10 20)" ;
@@ -353,13 +383,14 @@ mod tests {
353
383
354
384
#[ test]
355
385
fn expr_leftover ( ) {
386
+ use nom;
356
387
let foo = b"(+ 10 20))" ;
357
- use nom:: { IResult , Needed } ;
388
+ use nom:: Needed ;
358
389
use super :: exprs;
359
- use lang:: { Error , Result } ;
360
- match exprs ( foo) {
361
- IResult :: Done ( r, me) => {
362
- assert_eq ! ( r, b")" ) ;
390
+ use lang:: Result ;
391
+ match exprs ( CompleteByteSlice ( foo) ) {
392
+ Ok ( ( r, me) ) => {
393
+ assert_eq ! ( r, CompleteByteSlice ( b")" ) ) ;
363
394
assert_eq ! (
364
395
me. into_iter( ) . collect:: <Result <Vec <Expr >>>( ) . unwrap( ) ,
365
396
vec![
@@ -371,11 +402,10 @@ mod tests {
371
402
] ,
372
403
) ;
373
404
} ,
374
- IResult :: Error ( e) => panic ! ( e) ,
375
- IResult :: Incomplete ( Needed :: Unknown ) => panic ! ( "need more src" ) ,
376
- IResult :: Incomplete ( Needed :: Size ( s) ) => panic ! (
377
- Error :: from( format!( "need {} more bytes" , s) ) ,
378
- ) ,
405
+ Err ( nom:: Err :: Error ( e) ) |
406
+ Err ( nom:: Err :: Failure ( e) ) => panic ! ( e) ,
407
+ Err ( nom:: Err :: Incomplete ( Needed :: Unknown ) ) => panic ! ( "incomplete" ) ,
408
+ Err ( nom:: Err :: Incomplete ( Needed :: Size ( s) ) ) => panic ! ( "need {} more bytes" , s) ,
379
409
}
380
410
}
381
411
0 commit comments