mev-proc-impl 0.1.1

mev procedural macros implementation
Documentation
use proc_macro2::TokenStream;

macro_rules! parse_macro_input {
    ($token_stream:ident as $ty:ty) => {
        match syn::parse2::<$ty>($token_stream) {
            Ok(input) => input,
            Err(err) => return err.to_compile_error().into(),
        }
    };
}

mod args;
mod auto_repr;
mod r#match;
mod metal;
mod repr;
mod vertex;
mod vulkan;
// mod webgl;
mod webgpu;

pub fn arguments_derive(input: TokenStream, mev: &TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as syn::DeriveInput);

    let metal_tokens = match metal::arguments::derive(&input, mev) {
        Ok(tokens) => tokens,
        Err(err) => err.to_compile_error(),
    };

    let vulkan_tokens = match vulkan::arguments::derive(&input, mev) {
        Ok(tokens) => tokens,
        Err(err) => err.to_compile_error(),
    };

    let webgpu_tokens = match webgpu::arguments::derive(&input, mev) {
        Ok(tokens) => tokens,
        Err(err) => err.to_compile_error(),
    };
    quote::quote! {
        #mev::with_metal! { #metal_tokens }
        #mev::with_vulkan! { #vulkan_tokens }
        #mev::with_webgpu! { #webgpu_tokens }
    }
}

pub fn derive_repr(input: TokenStream, mev: &TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as syn::DeriveInput);

    match repr::derive(&input, mev) {
        Ok(tokens) => tokens,
        Err(err) => err.to_compile_error(),
    }
}

pub fn derive_auto_repr(input: TokenStream, mev: &TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as syn::DeriveInput);

    match auto_repr::derive(&input, mev) {
        Ok(tokens) => tokens,
        Err(err) => err.to_compile_error(),
    }
}

pub fn match_backend(input: TokenStream, mev: &TokenStream) -> TokenStream {
    r#match::match_backend(input, mev)
}

pub fn derive_vertex(input: TokenStream, mev: &TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as syn::DeriveInput);

    match vertex::derive(&input, mev) {
        Ok(tokens) => tokens,
        Err(err) => err.to_compile_error(),
    }
}