Skip to main content

reifydb_type/value/constraint/
scale.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 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/// Scale for a decimal type (decimal places)
15#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
16#[repr(transparent)]
17pub struct Scale(u8);
18
19impl Scale {
20	/// Create a new Scale value
21	pub fn new(scale: u8) -> Self {
22		Self(scale)
23	}
24
25	/// Create a new Scale value with validation against precision
26	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	/// Get the scale value
39	pub fn value(self) -> u8 {
40		self.0
41	}
42
43	/// Maximum scale (255 - maximum u8 value)
44	pub const MAX: Self = Self(255);
45
46	/// Minimum scale (0)
47	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}