use crate::prelude::{DbmsResult, Sanitize, Value};
pub struct RoundToScaleSanitizer(pub u32);
impl Sanitize for RoundToScaleSanitizer {
fn sanitize(&self, value: Value) -> DbmsResult<Value> {
match value {
Value::Decimal(num) => {
let rounded = num.0.round_dp(self.0);
Ok(Value::Decimal(rounded.into()))
}
other => Ok(other),
}
}
}
#[cfg(test)]
mod tests {
use rust_decimal::Decimal;
use super::*;
use crate::prelude::Value;
#[test]
fn test_round_to_scale_sanitizer() {
let sanitizer = RoundToScaleSanitizer(2);
let value = Value::Decimal(Decimal::new(123456, 4).into()); let sanitized_value = sanitizer.sanitize(value).unwrap();
assert_eq!(
sanitized_value,
Value::Decimal(Decimal::new(1235, 2).into())
);
let non_decimal_value = Value::Int32(42.into());
let sanitized_value = sanitizer.sanitize(non_decimal_value.clone()).unwrap();
assert_eq!(sanitized_value, non_decimal_value);
}
}