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