Skip to main content

parse

Function parse 

Source
pub fn parse<'r, 'e: 'r>(
    reader: &'r mut SourceReader<'e>,
) -> Result<Node<'e>, Error>
Expand description

Parse a single Node from a SourceReader, consuming that form.

§Examples

#[cfg(feature = "unstable")]
{
  use clojure_reader::parse::{Node, NodeKind::*, SourceReader, parse};

  let source = r#"
(->> txs
  (keep :refund-amt)
  (reduce +))
  ; total refund amount
"#;
  let mut reader = SourceReader::new(source);
  let Node { kind: node, .. } = parse(&mut reader).expect("failed to parse");

  let List(nodes, _) = node else { panic!("unexpected") };

  // Destruct main list
  let nodes: Vec<_> = nodes.into_iter().map(|n| n.kind).collect();
  let [Symbol("->>"), Symbol("txs"), List(keep, _), List(reduce, _)] = nodes.as_slice() else {
    panic!("unexpected");
  };

  // Destruct the list calling `keep`
  let keep: Vec<_> = keep.into_iter().map(|n| &n.kind).collect();
  let [Symbol("keep"), Key("refund-amt")] = keep.as_slice() else {
    panic!("unexpected");
  };

  // Destruct the list calling `reduce`
  let reduce: Vec<_> = reduce.into_iter().map(|n| &n.kind).collect();
  let [Symbol("reduce"), Symbol("+")] = reduce.as_slice() else {
    panic!("unexpected");
  };

  assert_eq!(reader.remaining(), "\n  ; total refund amount\n");
}

§Errors

See crate::error::Error.