alpha-shell 0.3.0

A transpiler for the AlphaShell language
use super::{
  block,
  error::{Error, TranspileResult},
  transpiler::{BlockType, Transpiler},
  value,
};
use crate::parse::{node::Node, r#for::Foreach};

pub fn transpile(t: &mut Transpiler, node: &Node) -> TranspileResult<String> {
  match node {
    Node::Foreach(Foreach {
      variable,
      iterable,
      block,
    }) => {
      t.push_block(BlockType::Foreach);
      let iterable = value::transpile_inner(t, iterable, node)?;
      t.pop_block();

      let head = t.use_indent(&format!("for {variable} ({iterable}); do"));
      let block = block::transpile_inner(t, block)?;
      let end = t.use_indent("done");

      let output = format!("{head}\n{block}\n{end}");

      Ok(output)
    }
    _ => Err(Error::new("Invalid node type", node)),
  }
}