diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-20 14:28:05 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2024-04-20 14:38:17 +0200 |
commit | e9bf0fc40c0eb7e9d4228b804d62f31b0a136528 (patch) | |
tree | 7872f587782d5635eadbf82ae861d474d4da2efe /crates/rebel/src/parse.rs | |
parent | 35e68444dd5e9d3d5fc39409c48be6eb3fa05e07 (diff) | |
download | rebel-e9bf0fc40c0eb7e9d4228b804d62f31b0a136528.tar rebel-e9bf0fc40c0eb7e9d4228b804d62f31b0a136528.zip |
Rename directories to match crate names
Diffstat (limited to 'crates/rebel/src/parse.rs')
-rw-r--r-- | crates/rebel/src/parse.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/crates/rebel/src/parse.rs b/crates/rebel/src/parse.rs new file mode 100644 index 0000000..5857efb --- /dev/null +++ b/crates/rebel/src/parse.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<T>(tag: rule<()>, value: rule<T>) -> 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(<":">, <name()>)? { + 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::*; |