cubecl-macros 0.10.0-pre.3

Procedural macros for CubeCL
Documentation
use darling::{FromMeta, util::Flag};
use proc_macro2::TokenStream;
use syn::{DeriveInput, Meta, parse_quote, parse2};

use crate::{generate_cube_type, generate_cube_type_mut, generate_into_runtime};

#[derive(FromMeta)]
#[darling(rename_all = "PascalCase")]
pub struct DeriveExpand {
    cube_type: Flag,
    cube_type_mut: Flag,
    cube_launch: Flag,
    into_runtime: Flag,
}

pub fn generate_derive_expand(input: TokenStream, meta: TokenStream) -> syn::Result<TokenStream> {
    let input: DeriveInput = parse2(input)?;
    let meta: Meta = parse_quote!(derive_expand(#meta));
    let derives = DeriveExpand::from_meta(&meta)?;

    let mut out = TokenStream::new();

    if derives.cube_type.is_present() {
        out.extend(generate_cube_type(&input, false)?);
    }
    if derives.cube_type_mut.is_present() {
        out.extend(generate_cube_type_mut(&input)?);
    }
    if derives.cube_launch.is_present() {
        out.extend(generate_cube_type(&input, true)?);
    }
    if derives.into_runtime.is_present() {
        out.extend(generate_into_runtime(&input)?)
    }

    Ok(out)
}