@@ -5,11 +5,16 @@ extern crate alloc;
55use alloc:: vec:: Vec ;
66
77use crate :: json:: { JsonObject , JsonValue , NumberValue } ;
8- use crate :: parser:: {
9- Concat , Concat3 , Either , Error , Input , OneOf , OneOrMore , Parser , ParserContext , ResultOf ,
10- ZeroOrMore , ZeroOrOne ,
8+ use lite_parser:: {
9+ impls:: SimpleError ,
10+ literals,
11+ parser:: {
12+ Concat , Concat3 , Either , OneOf , OneOrMore , Parser , ParserContext , ParserOptions ,
13+ ZeroOrMore , ZeroOrOne ,
14+ } ,
15+ parsers,
16+ traits:: { Error , Input , ResultOf } ,
1117} ;
12- use crate :: { literals, parsers} ;
1318
1419use core:: convert:: TryInto ;
1520
@@ -349,3 +354,139 @@ impl<I: Input> Parser<I> for Json {
349354 }
350355 }
351356}
357+
358+ pub fn parse_json ( input : & str ) -> Result < JsonValue , SimpleError > {
359+ parse_json_with_options ( input, Default :: default ( ) )
360+ }
361+
362+ pub fn parse_json_with_options (
363+ input : & str ,
364+ options : ParserOptions ,
365+ ) -> Result < JsonValue , SimpleError > {
366+ Json :: parse ( & input, Default :: default ( ) , & ParserContext :: new ( options) ) . map ( |( ret, _) | ret)
367+ }
368+
369+ #[ cfg( test) ]
370+ mod tests {
371+ use super :: * ;
372+ use crate :: NumberValue ;
373+ use lite_parser:: impls:: SimplePosition ;
374+
375+ #[ test]
376+ fn it_works ( ) {
377+ assert_eq ! (
378+ parse_json( & r#"{ "test": 1, "test2": [1e-4, 2.041e2, true, false, null, "\"1\n\""] }"# ) ,
379+ Ok ( JsonValue :: Object ( vec![
380+ (
381+ vec![ 't' , 'e' , 's' , 't' ] ,
382+ JsonValue :: Number ( NumberValue {
383+ integer: 1 ,
384+ fraction: 0 ,
385+ fraction_length: 0 ,
386+ exponent: 0
387+ } )
388+ ) ,
389+ (
390+ vec![ 't' , 'e' , 's' , 't' , '2' ] ,
391+ JsonValue :: Array ( vec![
392+ JsonValue :: Number ( NumberValue {
393+ integer: 1 ,
394+ fraction: 0 ,
395+ fraction_length: 0 ,
396+ exponent: -4 ,
397+ } ) ,
398+ JsonValue :: Number ( NumberValue {
399+ integer: 2 ,
400+ fraction: 41 ,
401+ fraction_length: 3 ,
402+ exponent: 2 ,
403+ } ) ,
404+ JsonValue :: Boolean ( true ) ,
405+ JsonValue :: Boolean ( false ) ,
406+ JsonValue :: Null ,
407+ JsonValue :: String ( vec![ '\"' , '1' , 'n' , '\"' ] )
408+ ] )
409+ )
410+ ] ) )
411+ )
412+ }
413+
414+ #[ test]
415+ fn it_should_consume_all ( ) {
416+ assert_eq ! (
417+ parse_json( & r#""1"a"# ) ,
418+ Err ( SimpleError {
419+ reasons: vec![ (
420+ SimplePosition {
421+ index: 3 ,
422+ line: 0 ,
423+ column: 3
424+ } ,
425+ "Expect end of input"
426+ ) ]
427+ } )
428+ )
429+ }
430+
431+ #[ test]
432+ fn it_accepts_nest_level ( ) {
433+ assert_eq ! (
434+ parse_json_with_options(
435+ & r#"{ "test": 1 }"# ,
436+ ParserOptions {
437+ max_nest_level: Some ( 1 )
438+ }
439+ ) ,
440+ Ok ( JsonValue :: Object ( vec![ (
441+ vec![ 't' , 'e' , 's' , 't' ] ,
442+ JsonValue :: Number ( NumberValue {
443+ integer: 1 ,
444+ fraction: 0 ,
445+ fraction_length: 0 ,
446+ exponent: 0
447+ } )
448+ ) , ] ) )
449+ ) ;
450+ }
451+
452+ #[ test]
453+ fn it_accepts_more_nest_level ( ) {
454+ assert_eq ! (
455+ parse_json_with_options(
456+ & r#"{ "test": { "a": [ {} ] } }"# ,
457+ ParserOptions {
458+ max_nest_level: Some ( 5 )
459+ }
460+ ) ,
461+ Ok ( JsonValue :: Object ( vec![ (
462+ vec![ 't' , 'e' , 's' , 't' ] ,
463+ JsonValue :: Object ( vec![ (
464+ vec![ 'a' ] ,
465+ JsonValue :: Array ( vec![ JsonValue :: Object ( vec![ ] ) ] )
466+ ) ] )
467+ ) ] ) )
468+ ) ;
469+ }
470+
471+ #[ test]
472+ fn it_error_on_too_deep_nest ( ) {
473+ assert_eq ! (
474+ parse_json_with_options(
475+ & r#"{ "test": { "a": [ {} ] } }"# ,
476+ ParserOptions {
477+ max_nest_level: Some ( 3 )
478+ }
479+ ) ,
480+ Err ( SimpleError {
481+ reasons: vec![ (
482+ SimplePosition {
483+ index: 0 ,
484+ line: 0 ,
485+ column: 0
486+ } ,
487+ "Value"
488+ ) ]
489+ } )
490+ ) ;
491+ }
492+ }
0 commit comments