Skip to main content

ic_stable_memory_derive/
lib.rs

1use crate::as_fixed_size_bytes::derive_as_fixed_size_bytes_impl;
2use crate::candid_as_dyn_size_bytes::derive_candid_as_dyn_size_bytes_impl;
3use crate::fixed_size_as_dyn_size_bytes::derive_fixed_size_as_dyn_size_bytes_impl;
4use crate::stable_type::derive_stable_type_impl;
5use proc_macro::TokenStream as Tokens;
6use proc_macro2::{self, TokenStream};
7use quote::quote;
8use syn::{parse_macro_input, DeriveInput, Fields, Ident, Index};
9
10mod as_fixed_size_bytes;
11mod candid_as_dyn_size_bytes;
12mod fixed_size_as_dyn_size_bytes;
13mod stable_type;
14
15/// Derives [ic_stable_memory::StableType] proxying flag toggling calls
16#[proc_macro_derive(StableType)]
17pub fn derive_stable_type(input: Tokens) -> Tokens {
18    let DeriveInput {
19        ident,
20        data,
21        generics,
22        ..
23    } = parse_macro_input!(input);
24
25    derive_stable_type_impl(&ident, &data, &generics).into()
26}
27
28/// Derives [ic_stable_memory::AsFixedSizeBytes]. Does not support generics at the moment.
29#[proc_macro_derive(AsFixedSizeBytes)]
30pub fn derive_as_fixed_size_bytes(input: Tokens) -> Tokens {
31    let DeriveInput {
32        ident,
33        data,
34        generics,
35        ..
36    } = parse_macro_input!(input);
37
38    derive_as_fixed_size_bytes_impl(&ident, &data, &generics).into()
39}
40
41/// Derives [ic_stable_memory::AsDynSizeBytes] for a type that already implements [candid::CandidType] and [candid::Deserialize].
42#[proc_macro_derive(CandidAsDynSizeBytes)]
43pub fn derive_candid_as_dyn_size_bytes(input: Tokens) -> Tokens {
44    let DeriveInput {
45        ident, generics, ..
46    } = parse_macro_input!(input);
47
48    derive_candid_as_dyn_size_bytes_impl(&ident, &generics).into()
49}
50
51/// Derives [ic_stable_memory::AsDynSizeBytes] for a type that already implements [ic_stable_memory::AsFixedSizeBytes].
52#[proc_macro_derive(FixedSizeAsDynSizeBytes)]
53pub fn derive_fixed_size_as_dyn_size_bytes(input: Tokens) -> Tokens {
54    let DeriveInput {
55        ident, generics, ..
56    } = parse_macro_input!(input);
57
58    derive_fixed_size_as_dyn_size_bytes_impl(&ident, &generics).into()
59}