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}