1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
mod as_primitive;
mod flat;
mod shader_data;

use proc_macro::TokenStream;

/// Derive the `ShaderData` trait for a struct
///
/// ## Example
///
/// ```rust
/// #[derive(blade_macros::ShaderData)]
/// struct Test {
///   sm: blade_graphics::Sampler,
/// }
/// ```
#[proc_macro_derive(ShaderData)]
pub fn shader_data_derive(input: TokenStream) -> TokenStream {
    let stream = match shader_data::generate(input) {
        Ok(tokens) => tokens,
        Err(err) => err.into_compile_error(),
    };
    stream.into()
}

/// Derive the `Flat` for a type.
///
/// Can either be used on a struct that has every field already implementing `blade_asset::Flat`:
///
/// ```rust
/// #[derive(blade_macros::Flat)]
/// struct FlatData<'a> {
///    array: [u32; 2],
///    single: f32,
///    slice: &'a [u16],
///}
/// ```
///
/// The struct may have a lifetime describing borrowed data members. Borrowing is
/// needed for zero-copy deserialization.
///
/// Alternatively, can be used on a transparent wrapper to force `blade_asset::Flat`
/// implementation even if the wrapped type doesn't implement it:
///
/// ```rust
/// #[derive(Clone, Copy)]
/// #[repr(u32)]
/// #[non_exhaustive]
/// enum Foo {
///     A,
///     B,
/// }
/// #[derive(blade_macros::Flat, Clone, Copy)]
/// #[repr(transparent)]
/// struct FooWrap(Foo);
/// ```
///
/// This can be particularly useful for types like `bytemuck::Pod` implementors,
/// or plain non-exhaustive enums from 3rd party crates.
#[proc_macro_derive(Flat)]
pub fn flat_derive(input: TokenStream) -> TokenStream {
    let stream = match flat::generate(input) {
        Ok(tokens) => tokens,
        Err(err) => err.into_compile_error(),
    };
    stream.into()
}

/// Derive the `Into<primitive>` trait for an enum
///
/// ## Example
///
/// ```rust
/// #[derive(blade_macros::AsPrimitive)]
/// #[repr(u32)]
/// enum Foo {
///   A,
///   B,
/// }
/// ```
#[proc_macro_derive(AsPrimitive)]
pub fn as_primitive_derive(input: TokenStream) -> TokenStream {
    let stream = match as_primitive::generate(input) {
        Ok(tokens) => tokens,
        Err(err) => err.into_compile_error(),
    };
    stream.into()
}