#![doc = include_str ! ("../README.md")]
use ::proc_macro::TokenStream;
use ::quote::quote;
use fpdec_core::{str_to_dec, ParseDecimalError, MAX_N_FRAC_DIGITS};
#[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 str_to_dec(&src) {
Err(e) => panic!("{}", e),
Ok((mut coeff, mut exponent)) => {
if -exponent > (MAX_N_FRAC_DIGITS as isize) {
panic!("{}", ParseDecimalError::FracDigitLimitExceeded)
}
if exponent > 38 {
panic!("{}", ParseDecimalError::InternalOverflow);
}
if exponent > 0 {
match coeff.checked_mul(10i128.pow(exponent as u32)) {
None => panic!("{}", ParseDecimalError::InternalOverflow),
Some(val) => {
coeff = val;
}
}
exponent = 0;
}
let n_frac_digits = -exponent as u8;
quote!(
Decimal::new_raw(#coeff, #n_frac_digits)
)
.into()
}
}
}