summaryrefslogtreecommitdiffstats
path: root/crates/rebel-parse/examples/parse-string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/rebel-parse/examples/parse-string.rs')
-rw-r--r--crates/rebel-parse/examples/parse-string.rs49
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());
+}