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::{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/// Scale for a decimal type (decimal places)
16#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
17#[repr(transparent)]
18pub struct Scale(u8);
19
20impl Scale {
21	/// Create a new Scale value
22	pub fn new(scale: u8) -> Self {
23		Self(scale)
24	}
25
26	/// Create a new Scale value with validation against precision
27	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	/// Get the scale value
35	pub fn value(self) -> u8 {
36		self.0
37	}
38
39	/// Maximum scale (255 - maximum u8 value)
40	pub const MAX: Self = Self(255);
41
42	/// Minimum scale (0)
43	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}