Skip to main content

native/vize_ex_nif/src/ir_encoding.rs

use rustler::{Encoder, Env, Term};
use vize_atelier_vapor::ir::IRProp;

use crate::atoms;

pub(crate) fn encode_simple_expr<'a>(
    env: Env<'a>,
    expr: &vize_atelier_core::SimpleExpressionNode,
) -> Term<'a> {
    if expr.is_static {
        rustler::types::tuple::make_tuple(
            env,
            &[
                atoms::static_().encode(env),
                expr.content.as_str().encode(env),
            ],
        )
    } else {
        expr.content.as_str().encode(env)
    }
}

pub(crate) fn encode_ir_prop<'a>(env: Env<'a>, prop: &IRProp) -> Term<'a> {
    let values: Vec<Term<'a>> = prop
        .values
        .iter()
        .map(|value| encode_simple_expr(env, value))
        .collect();

    term_map!(env, {
        atoms::key() => encode_simple_expr(env, &prop.key),
        atoms::values() => values,
        atoms::is_component() => prop.is_component,
    })
}