reifydb_type/value/constraint/
scale.rs1use std::fmt::{Display, Formatter};
5
6use serde::{Deserialize, Serialize};
7
8use super::precision::Precision;
9use crate::{
10 error::{Error, diagnostic::number::decimal_scale_exceeds_precision},
11 fragment::Fragment,
12 return_error,
13};
14
15#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
17#[repr(transparent)]
18pub struct Scale(u8);
19
20impl Scale {
21 pub fn new(scale: u8) -> Self {
23 Self(scale)
24 }
25
26 pub fn try_new_with_precision(scale: u8, precision: Precision) -> Result<Self, Error> {
28 if scale > precision.value() {
29 return_error!(decimal_scale_exceeds_precision(Fragment::None, scale, precision.value()));
30 }
31 Ok(Self(scale))
32 }
33
34 pub fn value(self) -> u8 {
36 self.0
37 }
38
39 pub const MAX: Self = Self(255);
41
42 pub const MIN: Self = Self(0);
44}
45
46impl Display for Scale {
47 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
48 self.0.fmt(f)
49 }
50}
51
52impl From<Scale> for u8 {
53 fn from(scale: Scale) -> Self {
54 scale.0
55 }
56}
57
58impl From<u8> for Scale {
59 fn from(value: u8) -> Self {
60 Self::new(value)
61 }
62}