pub(crate) mod accumulator_macros;
mod codegen;
pub(crate) mod graph_ir;
mod parser;
use proc_macro::TokenStream;
pub fn computation_graph_attr(args: TokenStream, input: TokenStream) -> TokenStream {
let args2 = proc_macro2::TokenStream::from(args);
let input2 = proc_macro2::TokenStream::from(input);
match computation_graph_impl(args2, input2) {
Ok(output) => output.into(),
Err(err) => err.to_compile_error().into(),
}
}
fn computation_graph_impl(
args: proc_macro2::TokenStream,
input: proc_macro2::TokenStream,
) -> syn::Result<proc_macro2::TokenStream> {
let topology = syn::parse2::<parser::ParsedTopology>(args)?;
let module = syn::parse2::<syn::ItemMod>(input)?;
let ir = graph_ir::GraphIR::from_parsed(topology)
.map_err(|e| syn::Error::new(proc_macro2::Span::call_site(), e.to_string()))?;
codegen::generate(&ir, &module)
}