use ::proc_macro::TokenStream;
use ::quote::quote;
use rust_fixed_point_decimal_core::{
dec_repr_from_str, ParseDecimalError, MAX_PREC,
};
#[allow(non_snake_case)]
#[proc_macro]
pub fn Dec(input: TokenStream) -> TokenStream {
let mut src = input.to_string();
if src.starts_with("- ") || src.starts_with("+ ") {
src.remove(1);
}
match dec_repr_from_str(&src) {
Err(e) => panic!("{}", e),
Ok((mut coeff, mut exponent)) => {
if -exponent > (MAX_PREC as isize) {
panic!("{}", ParseDecimalError::PrecLimitExceeded)
}
if exponent > 38 {
panic!("{}", ParseDecimalError::MaxValueExceeded);
}
if exponent > 0 {
match coeff.checked_mul(10i128.pow(exponent as u32)) {
None => panic!("{}", ParseDecimalError::MaxValueExceeded),
Some(val) => {
coeff = val;
}
}
exponent = 0;
}
let prec = -exponent as u8;
quote!(
rust_fixed_point_decimal::Decimal::<#prec>
::new_raw(#coeff)
)
.into()
}
}
}