use crate::error::ArithmeticError;
pub const MAX_SCALE: u8 = 28;
pub const USDC_SCALE: u8 = 6;
pub const SOL_SCALE: u8 = 9;
pub const BPS_SCALE: u8 = 4;
#[derive(Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct Decimal {
pub(crate) mantissa: i128,
pub(crate) scale: u8,
}
impl Decimal {
pub const ZERO: Self = Self { mantissa: 0, scale: 0 };
pub const ONE: Self = Self { mantissa: 1, scale: 0 };
pub const MAX: Self = Self { mantissa: i128::MAX, scale: 0 };
pub const MIN: Self = Self { mantissa: i128::MIN, scale: 0 };
pub const NEG_ONE: Self = Self { mantissa: -1, scale: 0 };
pub const HUNDRED: Self = Self { mantissa: 100, scale: 0 };
pub const TEN_THOUSAND: Self = Self { mantissa: 10_000, scale: 0 };
#[inline]
pub fn new(mantissa: i128, scale: u8) -> Result<Self, ArithmeticError> {
if scale > MAX_SCALE {
return Err(ArithmeticError::ScaleExceeded);
}
Ok(Self { mantissa, scale })
}
#[inline]
pub(crate) const fn new_unchecked(mantissa: i128, scale: u8) -> Self {
Self { mantissa, scale }
}
#[inline]
pub fn mantissa(self) -> i128 {
self.mantissa
}
#[inline]
pub fn scale(self) -> u8 {
self.scale
}
#[inline]
pub fn is_zero(self) -> bool {
self.mantissa == 0
}
#[inline]
pub fn is_positive(self) -> bool {
self.mantissa > 0
}
#[inline]
pub fn is_negative(self) -> bool {
self.mantissa < 0
}
}