live_entity_derive/
lib.rs1mod 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}