diff options
Diffstat (limited to 'crates/rebel-parse/examples/parse-string.rs')
-rw-r--r-- | crates/rebel-parse/examples/parse-string.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/crates/rebel-parse/examples/parse-string.rs b/crates/rebel-parse/examples/parse-string.rs new file mode 100644 index 0000000..ba6a378 --- /dev/null +++ b/crates/rebel-parse/examples/parse-string.rs @@ -0,0 +1,49 @@ +use std::{fmt::Debug, time::Instant}; + +use clap::{Parser, ValueEnum}; + +use rebel_parse::recipe; + +#[derive(Clone, Debug, ValueEnum)] +enum Rule { + Recipe, + RecipeStmt, + Body, + BodyStmt, + Expr, +} + +#[derive(Clone, Debug, Parser)] +struct Opts { + rule: Rule, + input: String, +} + +fn main() { + let opts: Opts = Opts::parse(); + let input = opts.input.trim(); + + fn as_debug<'a>(v: impl Debug + 'a) -> Box<dyn Debug + 'a> { + Box::new(v) + } + + let start = Instant::now(); + let result = match opts.rule { + Rule::Recipe => recipe::recipe(input).map(as_debug), + Rule::RecipeStmt => recipe::recipe_stmt(input).map(as_debug), + Rule::Body => recipe::body(input).map(as_debug), + Rule::BodyStmt => recipe::body_stmt(input).map(as_debug), + Rule::Expr => recipe::expr(input).map(as_debug), + }; + let dur = Instant::now().duration_since(start); + + match result { + Ok(value) => { + println!("{value:#?}"); + } + Err(err) => { + println!("{err}"); + } + }; + println!("Took {} us", dur.as_micros()); +} |