reifydb_type/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)]
16#[repr(transparent)]
17pub struct Scale(u8);
18
19impl Scale {
20 pub fn new(scale: u8) -> Self {
22 Self(scale)
23 }
24
25 pub fn try_new_with_precision(scale: u8, precision: Precision) -> Result<Self, Error> {
27 if scale > precision.value() {
28 return Err(TypeError::DecimalScaleExceedsPrecision {
29 scale,
30 precision: precision.value(),
31 fragment: Fragment::None,
32 }
33 .into());
34 }
35 Ok(Self(scale))
36 }
37
38 pub fn value(self) -> u8 {
40 self.0
41 }
42
43 pub const MAX: Self = Self(255);
45
46 pub const MIN: Self = Self(0);
48}
49
50impl Display for Scale {
51 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
52 self.0.fmt(f)
53 }
54}
55
56impl From<Scale> for u8 {
57 fn from(scale: Scale) -> Self {
58 scale.0
59 }
60}
61
62impl From<u8> for Scale {
63 fn from(value: u8) -> Self {
64 Self::new(value)
65 }
66}