From c6ffec49cdd92ef73c098e3ff7a0ca334f78f67d Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 20 Apr 2024 14:36:37 +0200 Subject: rebel: move parsing to a separate crate --- Cargo.lock | 9 +++++- crates/rebel-parse/Cargo.toml | 11 +++++++ crates/rebel-parse/src/lib.rs | 72 +++++++++++++++++++++++++++++++++++++++++++ crates/rebel/Cargo.toml | 2 +- crates/rebel/src/context.rs | 2 +- crates/rebel/src/main.rs | 1 - crates/rebel/src/parse.rs | 72 ------------------------------------------- 7 files changed, 93 insertions(+), 76 deletions(-) create mode 100644 crates/rebel-parse/Cargo.toml create mode 100644 crates/rebel-parse/src/lib.rs delete mode 100644 crates/rebel/src/parse.rs diff --git a/Cargo.lock b/Cargo.lock index 6a6062c..fc2c1b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -489,8 +489,8 @@ dependencies = [ "indoc", "lazy_static", "nix", - "peg", "rebel-common", + "rebel-parse", "rebel-runner", "scoped-tls-hkt", "serde", @@ -506,6 +506,13 @@ dependencies = [ "serde", ] +[[package]] +name = "rebel-parse" +version = "0.1.0" +dependencies = [ + "peg", +] + [[package]] name = "rebel-runner" version = "0.1.0" diff --git a/crates/rebel-parse/Cargo.toml b/crates/rebel-parse/Cargo.toml new file mode 100644 index 0000000..29dc1ed --- /dev/null +++ b/crates/rebel-parse/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rebel-parse" +version = "0.1.0" +authors = ["Matthias Schiffer "] +license = "MIT" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +peg = "0.8.2" diff --git a/crates/rebel-parse/src/lib.rs b/crates/rebel-parse/src/lib.rs new file mode 100644 index 0000000..5857efb --- /dev/null +++ b/crates/rebel-parse/src/lib.rs @@ -0,0 +1,72 @@ +#[derive(Debug, Clone, Copy)] +pub struct TaskID<'a> { + pub recipe: &'a str, + pub task: &'a str, +} + +#[derive(Debug, Clone, Copy, Default)] +pub struct TaskArgs<'a> { + pub host: Option<&'a str>, + pub target: Option<&'a str>, +} + +#[derive(Debug, Clone, Copy)] +pub struct Task<'a> { + pub id: TaskID<'a>, + pub args: TaskArgs<'a>, +} + +#[derive(Debug, Clone, Copy)] +pub struct TaskFlags { + pub force_run: bool, +} + +peg::parser! { + grammar rules() for str { + rule t(tag: rule<()>, value: rule) -> T + = tag() v:value() { v } + + rule name_char() + = ['a'..='z' | 'A' ..='Z' | '0'..='9' | '_' | '-'] + + rule name() -> &'input str + = $(name_char()+) + + rule recipe_id() -> &'input str + = $(name() ("/" name())?) + + rule task_id() -> TaskID<'input> + = recipe:recipe_id() "::" task:name() { + TaskID { recipe, task } + } + + rule task_args() -> TaskArgs<'input> + = "@" host:name()? target:t(<":">, )? { + TaskArgs { + host, + target, + } + } + / { Default::default() } + + pub rule task() -> Task<'input> + = id:task_id() args:task_args() { + Task { + id, + args, + } + } + + rule force_run() -> bool + = "+" { true } + / { false } + + rule task_flags() -> TaskFlags + = force_run:force_run() { TaskFlags { force_run } } + + pub rule task_with_flags() -> (Task<'input>, TaskFlags) + = task:task() flags:task_flags() { (task, flags) } + } +} + +pub use rules::*; diff --git a/crates/rebel/Cargo.toml b/crates/rebel/Cargo.toml index 9d5c498..9f229c8 100644 --- a/crates/rebel/Cargo.toml +++ b/crates/rebel/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" [dependencies] rebel-common = { path = "../rebel-common" } +rebel-parse = { path = "../rebel-parse" } rebel-runner = { path = "../rebel-runner" } clap = { version = "4.0.0", features = ["derive"] } @@ -22,4 +23,3 @@ scoped-tls-hkt = "0.1.2" serde = { version = "1", features = ["derive", "rc"] } serde_yaml = "0.9" walkdir = "2" -peg = "0.8.2" diff --git a/crates/rebel/src/context.rs b/crates/rebel/src/context.rs index 084facd..fa24399 100644 --- a/crates/rebel/src/context.rs +++ b/crates/rebel/src/context.rs @@ -14,10 +14,10 @@ use rebel_common::{ string_hash::ArchiveHash, types::TaskID, }; +use rebel_parse::{self as parse, TaskFlags}; use crate::{ args::*, - parse::{self, TaskFlags}, paths, pin::{self, Pins}, task::*, diff --git a/crates/rebel/src/main.rs b/crates/rebel/src/main.rs index 54ea1cf..76b4551 100644 --- a/crates/rebel/src/main.rs +++ b/crates/rebel/src/main.rs @@ -1,7 +1,6 @@ mod args; mod context; mod driver; -mod parse; mod paths; mod pin; mod recipe; diff --git a/crates/rebel/src/parse.rs b/crates/rebel/src/parse.rs deleted file mode 100644 index 5857efb..0000000 --- a/crates/rebel/src/parse.rs +++ /dev/null @@ -1,72 +0,0 @@ -#[derive(Debug, Clone, Copy)] -pub struct TaskID<'a> { - pub recipe: &'a str, - pub task: &'a str, -} - -#[derive(Debug, Clone, Copy, Default)] -pub struct TaskArgs<'a> { - pub host: Option<&'a str>, - pub target: Option<&'a str>, -} - -#[derive(Debug, Clone, Copy)] -pub struct Task<'a> { - pub id: TaskID<'a>, - pub args: TaskArgs<'a>, -} - -#[derive(Debug, Clone, Copy)] -pub struct TaskFlags { - pub force_run: bool, -} - -peg::parser! { - grammar rules() for str { - rule t(tag: rule<()>, value: rule) -> T - = tag() v:value() { v } - - rule name_char() - = ['a'..='z' | 'A' ..='Z' | '0'..='9' | '_' | '-'] - - rule name() -> &'input str - = $(name_char()+) - - rule recipe_id() -> &'input str - = $(name() ("/" name())?) - - rule task_id() -> TaskID<'input> - = recipe:recipe_id() "::" task:name() { - TaskID { recipe, task } - } - - rule task_args() -> TaskArgs<'input> - = "@" host:name()? target:t(<":">, )? { - TaskArgs { - host, - target, - } - } - / { Default::default() } - - pub rule task() -> Task<'input> - = id:task_id() args:task_args() { - Task { - id, - args, - } - } - - rule force_run() -> bool - = "+" { true } - / { false } - - rule task_flags() -> TaskFlags - = force_run:force_run() { TaskFlags { force_run } } - - pub rule task_with_flags() -> (Task<'input>, TaskFlags) - = task:task() flags:task_flags() { (task, flags) } - } -} - -pub use rules::*; -- cgit v1.2.3