zink_codegen/
lib.rs

1//! Code generation library for the zink API
2
3use proc_macro::TokenStream;
4use syn::{parse_macro_input, DeriveInput, ItemFn, ItemStruct};
5
6mod event;
7mod selector;
8mod storage;
9
10/// Event logging interface
11///
12/// ```ignore
13/// use zink::Event;
14///
15/// /// A `Ping` event.
16/// #[derive(Event)]
17/// struct Ping;
18///
19/// #[no_mangle]
20/// pub extern "C" fn log0() {
21///     Ping.log0();
22/// }
23/// ```
24///
25/// will generate:
26///
27/// ```ignore
28/// struct Ping;
29///
30/// impl zink::Event for Ping {
31///     const NAME: &'static [u8] = b"Ping";
32/// }
33/// ```
34#[proc_macro_derive(Event)]
35pub fn event(input: TokenStream) -> TokenStream {
36    let input = parse_macro_input!(input as DeriveInput);
37    event::parse(input)
38}
39
40/// Declare on-chain storage
41///
42/// ```ignore
43/// /// storage value
44/// #[zink::storage(i32)]
45/// pub struct Counter;
46///
47/// /// storage mapping
48/// #[zink::storage(i32 => i32)]
49/// pub struct Mapping;
50/// ```
51#[proc_macro_attribute]
52pub fn storage(attr: TokenStream, input: TokenStream) -> TokenStream {
53    let input = parse_macro_input!(input as ItemStruct);
54    storage::parse(attr.into(), input)
55}
56
57/// Mark the function as an external entry point.
58#[proc_macro_attribute]
59pub fn external(_args: TokenStream, input: TokenStream) -> TokenStream {
60    let input = parse_macro_input!(input as ItemFn);
61    selector::external(input)
62}