unc_units_macro/
lib.rs

1extern crate proc_macro;
2use std::num::ParseIntError;
3
4use unc_units_core::{gas, near};
5use proc_macro::TokenStream;
6use proc_macro2::Span;
7use quote::quote;
8use syn::{ExprLit, Lit};
9
10fn parse_knobs<F>(item: TokenStream, parse: F) -> TokenStream
11where
12    F: FnOnce(&str) -> Result<u128, ParseIntError>,
13{
14    match syn::parse::<ExprLit>(item) {
15        Ok(ExprLit {
16            lit: Lit::Str(str), ..
17        }) => {
18            let str = parse(&str.value()).unwrap();
19            TokenStream::from(quote! {#str})
20        }
21        _ => TokenStream::from(
22            syn::Error::new(
23                Span::call_site(),
24                "parse can only be used with string literals",
25            )
26            .to_compile_error(),
27        ),
28    }
29}
30
31#[proc_macro]
32pub fn parse_unc(item: TokenStream) -> TokenStream {
33    parse_knobs(item, near::parse)
34}
35
36#[proc_macro]
37pub fn parse_gas(item: TokenStream) -> TokenStream {
38    parse_knobs(item, |x| gas::parse(x))
39}