ckb_occupied_capacity_macros/
lib.rs1extern crate proc_macro;
3
4use quote::quote;
5use syn::{parse_macro_input, Error as SynError};
6
7use ckb_occupied_capacity_core::Capacity;
8
9#[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}