live_entity_derive/
lib.rs

1mod util;
2
3use util::*;
4mod entity;
5use entity::*;
6mod updatable;
7use updatable::*;
8
9use syn::{parse_macro_input, DeriveInput};
10
11#[proc_macro_derive(Entity, attributes(entity_id, entity_name))]
12pub fn derive_entity(stream: proc_macro::TokenStream) -> proc_macro::TokenStream {
13    let input = parse_macro_input!(stream as DeriveInput);
14    let name = &input.ident;
15    let name_str = get_name_str(&input.attrs, name.span());
16    let fields = named_fields_of_struct(input_as_struct(&input));
17    let (id, other_fields) = extract_id_field(fields);
18
19    let mut output = impl_updatable(name, &other_fields);
20
21    output.extend(match id {
22        Ok(id_field) => match name_str {
23            Ok(name_str) => impl_entity(name, name_str, id_field, &other_fields).into(),
24            Err(e) => e.into_compile_error(),
25        },
26        Err(e) => e.into_compile_error(),
27    });
28    output.into()
29}
30
31#[proc_macro_derive(Updatable)]
32pub fn derive_updatable(stream: proc_macro::TokenStream) -> proc_macro::TokenStream {
33    let input = parse_macro_input!(stream as DeriveInput);
34    let name = &input.ident;
35    let fields = named_fields_of_struct(input_as_struct(&input))
36        .named
37        .iter()
38        .collect();
39    impl_updatable(name, &fields).into()
40}