vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
//! Node encoder for the stable IR wire format.

use super::{put_expr, put_nodes};
use crate::ir::serial::wire::framing::{put_string, put_u8};
use crate::ir::serial::wire::Node;

/// Append the tag and payload for one control-flow or storage node.
///
/// # Errors
///
/// Returns an actionable error when a nested expression, block, or identifier
/// cannot be represented by the current wire schema.
#[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(())
}