Skip to main content

reifydb_value/value/constraint/
scale.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}