sprout 1.0.0

A rust crate for growing simple, but beautiful AST trees 🌳
Documentation
use std::fmt;

use sprout::prelude::*;

#[test]
pub fn example_from_readme() {
	#[derive(Debug, PartialEq, Eq, Clone, Copy)]
	pub enum Token {
		Number,
		Word,
		Space
	}
	
	impl fmt::Display for Token {
		fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
			match self {
				Self::Number => write!(f, "number"),
				Self::Word => write!(f, "word"),
				Self::Space => write!(f, "space")
			}
		}
	}

	#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
	pub enum Proc {
		TwoOrThreeWords,
		WordOrNumber,
		Sequence
	}

	impl fmt::Display for Proc {
		fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
			match self {
				Self::TwoOrThreeWords => write!(f, "two or three words")?,
				Self::WordOrNumber => write!(f, "word or number")?,
				Self::Sequence => write!(f, "word/number sequence")?
			}
			Ok(())
		}
	}

	use Token::*;
	use Proc::*;

	let alphabet = alphabet! {
		Number => "[0-9]+";
		Word => "[a-z]+";
		Space => " "
	};

	let grammar = grammar! {
		#TwoOrThreeWords => Word, Space, Word, (Space, Word)?;
		#WordOrNumber => [Word; Number];
		#Sequence => ([#TwoOrThreeWords; #WordOrNumber]){Space}+;
	};

	let parser = Parser::new(alphabet, grammar);

	let tree = parser.parse(Proc::Sequence, "abc ab 123 xyz 69".to_string());

	assert_eq!(
		tree.unwrap().to_string(),
		r#"Sequence["abc ab 123 xyz 69"]( TwoOrThreeWords["abc ab"] WordOrNumber["123"] WordOrNumber["xyz"] WordOrNumber["69"] )"#
	)
}