Skip to main content

typelock_derive/
lib.rs

1use darling::FromDeriveInput;
2use syn::{parse_macro_input, DeriveInput};
3
4use crate::{
5    lock_schema::LockSchemaReceiver,
6    postcard_codec::{FromBytesReceiver, ToBytesReceiver},
7};
8
9mod lock_schema;
10mod postcard_codec;
11
12#[proc_macro_derive(LockSchema, attributes(typelock, secure))]
13pub fn derive_lock_schema(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
14    let input = parse_macro_input!(input as DeriveInput);
15
16    let input = match LockSchemaReceiver::from_derive_input(&input) {
17        Ok(val) => val,
18        Err(e) => return e.write_errors().into(),
19    };
20
21    lock_schema::generate(&input)
22        .unwrap_or_else(|e| e.into_compile_error())
23        .into()
24}
25
26#[proc_macro_derive(ToBytes)]
27pub fn derive_to_bytes(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
28    let input = parse_macro_input!(input as DeriveInput);
29
30    let input = match ToBytesReceiver::from_derive_input(&input) {
31        Ok(val) => val,
32        Err(e) => return e.write_errors().into(),
33    };
34
35    postcard_codec::generate_to_bytes(&input)
36        .unwrap_or_else(|e| e.into_compile_error())
37        .into()
38}
39
40#[proc_macro_derive(FromBytes)]
41pub fn derive_from_bytes(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
42    let input = parse_macro_input!(input as DeriveInput);
43
44    let input = match FromBytesReceiver::from_derive_input(&input) {
45        Ok(val) => val,
46        Err(e) => return e.write_errors().into(),
47    };
48
49    postcard_codec::generate_from_bytes(&input)
50        .unwrap_or_else(|e| e.into_compile_error())
51        .into()
52}