Guest User

Untitled

a guest
May 21st, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.98 KB | None | 0 0
  1. // cargo-deps: nom="4.0"
  2. use std::fs;
  3.  
  4. #[macro_use]
  5. extern crate nom;
  6.  
  7. #[derive(Debug)]
  8. enum JsonValue {
  9. String(String),
  10. Number(f64),
  11. Array(Vec<JsonValue>),
  12. Object(Vec<(JsonValue, JsonValue)>),
  13. True,
  14. False,
  15. Null,
  16. }
  17.  
  18. // XXX: If we add a second `nom::multispace0` after the `tag!("}")` for some reason the input can
  19. // never be decided. I'm pretty sure we don't need it, however.
  20. named!(
  21. object(&[u8]) -> JsonValue,
  22. delimited!(
  23. tuple!(nom::multispace0, tag!("{"), nom::multispace0),
  24. map!(
  25. separated_list!(
  26. tuple!(nom::multispace0, tag!(","), nom::multispace0),
  27. do_parse!(
  28. key: string >>
  29. tuple!(nom::multispace0, tag!(":"), nom::multispace0) >>
  30. value: value >>
  31. (key, value))
  32. ),
  33. JsonValue::Object
  34. ),
  35. tuple!(nom::multispace0, tag!("}"))
  36. )
  37. );
  38.  
  39. named!(
  40. array(&[u8]) -> JsonValue,
  41. ws!(delimited!(tag!("["),
  42. map!(separated_list!(tuple!(nom::multispace0, tag!(","), nom::multispace0), value), JsonValue::Array),
  43. tag!("]")))
  44. );
  45.  
  46. named!(value(&[u8]) -> JsonValue, alt!(string | number | object | array | constant ));
  47.  
  48. // FIXME: Handle escapes!
  49. named!(
  50. string_char(&[u8]) -> char,
  51. none_of!("\"")
  52. );
  53.  
  54. named!(
  55. string(&[u8]) -> JsonValue,
  56. map!(delimited!(tag!("\""), many0!(string_char), tag!("\"")),
  57. |o| JsonValue::String(o.into_iter().collect()))
  58. );
  59.  
  60. named!(
  61. number(&[u8]) -> JsonValue,
  62. map!(nom::double, JsonValue::Number)
  63. );
  64.  
  65. named!(
  66. constant(&[u8]) -> JsonValue,
  67. alt!(
  68. tag!("true") => { |_| JsonValue::True } |
  69. tag!("false") => { |_| JsonValue::False } |
  70. tag!("null") => { |_| JsonValue::Null }
  71. )
  72. );
  73.  
  74. fn main() {
  75. let contents = fs::read("sample.json").unwrap();
  76. let sample = nom::types::CompleteByteSlice(&contents);
  77. let (_, parsed_json) = object(&sample).unwrap();
  78. println!("{:#?}", parsed_json);
  79. }
Add Comment
Please, Sign In to add comment