use super::{put_expr, put_nodes};
use crate::ir::serial::wire::framing::{put_string, put_u8};
use crate::ir::serial::wire::Node;
#[inline]
pub fn put_node(out: &mut Vec<u8>, node: &Node) -> Result<(), String> {
match node {
Node::Let { name, value } => {
put_u8(out, 0);
put_string(out, name)?;
put_expr(out, value)?;
}
Node::Assign { name, value } => {
put_u8(out, 1);
put_string(out, name)?;
put_expr(out, value)?;
}
Node::Store {
buffer,
index,
value,
} => {
put_u8(out, 2);
put_string(out, buffer)?;
put_expr(out, index)?;
put_expr(out, value)?;
}
Node::If {
cond,
then,
otherwise,
} => {
put_u8(out, 3);
put_expr(out, cond)?;
put_nodes(out, then)?;
put_nodes(out, otherwise)?;
}
Node::Loop {
var,
from,
to,
body,
} => {
put_u8(out, 4);
put_string(out, var)?;
put_expr(out, from)?;
put_expr(out, to)?;
put_nodes(out, body)?;
}
Node::Return => put_u8(out, 5),
Node::Block(nodes) => {
put_u8(out, 6);
put_nodes(out, nodes)?;
}
Node::Barrier => put_u8(out, 7),
}
Ok(())
}