pub use rules::*; use rebel_common::types::TaskIDRef; #[derive(Debug, Clone, Copy)] pub struct TaskRef<'a> { pub id: TaskIDRef<'a>, pub args: TaskArgs<'a>, } #[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 TaskFlags { pub force_run: bool, } peg::parser! { pub grammar rules() for str { pub rule task_ref_with_flags() -> (TaskRef<'input>, TaskFlags) = task:task_ref() flags:task_flags() { (task, flags) } pub rule task_ref() -> TaskRef<'input> = id:task_id() args:task_args() { TaskRef { id, args, } } rule recipe_id() -> &'input str = $(name() ("/" name())?) rule task_id() -> TaskIDRef<'input> = recipe:recipe_id() "::" task:name() { TaskIDRef { recipe, task } } rule task_args() -> TaskArgs<'input> = "@" host:name()? target:tagged(<":">, )? { TaskArgs { host, target, } } / { Default::default() } rule task_flags() -> TaskFlags = force_run:force_run() { TaskFlags { force_run } } rule force_run() -> bool = "+" { true } / { false } rule name() -> &'input str = $(['a'..='z' | 'A' ..='Z' | '0'..='9' | '_' | '-']+) rule tagged(tag: rule<()>, value: rule) -> T = tag() v:value() { v } } }