From 79c4e340d6c0a598f5d9cd0115a7e5ac0304d459 Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Sat, 7 Mar 2026 09:14:28 +0100 Subject: variable assignments --- src/parse.rs | 35 ++++++++++++++++++++++++++++++----- 1 file 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 { - AssignVar(AssignVar), + VarAssign(VarAssign), Pipes(Pipes), } impl Ast { pub fn expand(self, e: &mut E) -> Res, 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 { } #[derive(Debug, Clone)] -pub struct AssignVar { - pub to: String, - // TODO: body +pub struct VarAssign { + pub var: S::Str, + pub val: S::Str, +} + +impl Parse for VarAssign { + fn parse(b: &mut Cursor<'_>) -> Result { + 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 = std::result::Result; -- cgit v1.2.3