ckb_occupied_capacity_macros/
lib.rs

1//! TODO(doc): @keroro520
2extern crate proc_macro;
3
4use quote::quote;
5use syn::{parse_macro_input, Error as SynError};
6
7use ckb_occupied_capacity_core::Capacity;
8
9/// TODO(doc): @keroro520
10#[proc_macro]
11pub fn capacity_bytes(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
12    let input = parse_macro_input!(input as syn::LitInt);
13    let expanded = {
14        if input.suffix().is_empty() {
15            input
16                .base10_parse::<usize>()
17                .map_err(|_| {
18                    SynError::new(
19                        input.span(),
20                        "the input should be a positive integer literal",
21                    )
22                })
23                .and_then(|value| {
24                    Capacity::bytes(value)
25                        .map_err(|_| SynError::new(input.span(), "the input capacity is overflow"))
26                        .map(|value| {
27                            let shannons =
28                                syn::LitInt::new(&value.as_u64().to_string(), input.span());
29                            quote!(Capacity::shannons(#shannons))
30                        })
31                })
32        } else {
33            Err(SynError::new(
34                input.span(),
35                "the input should be an integer literal without any suffix",
36            ))
37        }
38        .unwrap_or_else(|err| err.to_compile_error())
39    };
40    expanded.into()
41}