datex_macros 0.1.8

The public macros for the DATEX Core Rust implementation
Documentation
use crate::utils::expr_to_value_container;
use datex_core::{
    compiler::{CompileOptions, compile_template},
    prelude::*,
    runtime::Runtime,
    values::value_container::ValueContainer,
};
use proc_macro2::TokenStream;
use quote::quote;
use syn::{
    Expr, LitStr, Result,
    parse::{Parse, ParseStream},
    punctuated::Punctuated,
    token::Comma,
};

pub struct PrecompileInput {
    pub script: String,
    pub args: Vec<ValueContainer>,
}

impl Parse for PrecompileInput {
    fn parse(input: ParseStream) -> Result<Self> {
        let pattern: LitStr = input.parse()?;
        let _ = input.parse::<Option<Comma>>()?;
        let args = Punctuated::<Expr, Comma>::parse_terminated(input)?
            .iter()
            .map(expr_to_value_container)
            .collect::<Result<Vec<_>>>()?;
        Ok(Self {
            script: pattern.value(),
            args,
        })
    }
}

pub fn precompile(input: PrecompileInput) -> TokenStream {
    let runtime = Runtime::stub();
    let PrecompileInput { script, args, .. } = input;
    let dxb = compile_template(
        &script,
        args.iter().cloned().map(Some).collect::<Vec<_>>(),
        CompileOptions::default(),
        runtime,
    )
    .unwrap()
    .0
    .dxb;
    quote! {
        vec![#(#dxb),*]
    }
}