diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse.rs | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/src/parse.rs b/src/parse.rs index 2902633..cbc37bf 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -27,14 +27,14 @@ pub trait Expander { #[derive(Debug, Clone)] pub enum Ast<T: Stage> { - AssignVar(AssignVar), + VarAssign(VarAssign), Pipes(Pipes<T>), } impl Ast<PreExpansion> { pub fn expand<E: Expander>(self, e: &mut E) -> Res<Ast<PostExpansion>, E::Error> { match self { - Ast::AssignVar(_) => todo!(), + Ast::VarAssign(_) => todo!(), Ast::Pipes(pipes) => Ok(Ast::Pipes(pipes.expand(e)?)), } } @@ -100,9 +100,32 @@ pub struct VarDecl<S: Stage> { } #[derive(Debug, Clone)] -pub struct AssignVar { - pub to: String, - // TODO: body +pub struct VarAssign<S: Stage> { + pub var: S::Str, + pub val: S::Str, +} + +impl Parse for VarAssign<PreExpansion> { + fn parse(b: &mut Cursor<'_>) -> Result<Self> { + if !b.buf.starts_with(b"set ") && !b.buf.starts_with(b"set\t") { + return Err(ParseError::NotAVarAssign); + } + b.advance(4); + b.spaces(); + let var = ExpString::parse(b)?; + b.spaces(); + + if b.is_empty() { + return Err(ParseError::Eof); + } + let eq = b.adv(); + if eq != b'=' { + return Err(ParseError::Expected('=')); + } + let val = ExpString::parse(b)?; + + Ok(Self { var, val }) + } } #[derive(Debug, Clone)] @@ -364,6 +387,8 @@ pub enum ParseError { NotAString, NotAFunDecl, + + NotAVarAssign, } type Result<T> = std::result::Result<T, ParseError>; |
