cesr/core/primitives/
number.rs1use crate::core::matter::code::NumberCode;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct Number {
6 code: NumberCode,
7 value: u128,
8}
9
10impl Number {
11 #[must_use]
13 pub const fn new(value: u128) -> Self {
14 let code = NumberCode::for_value(value);
15 Self { code, value }
16 }
17
18 #[must_use]
20 pub const fn with_code(code: NumberCode, value: u128) -> Self {
21 Self { code, value }
22 }
23
24 #[must_use]
26 pub const fn code(&self) -> &NumberCode {
27 &self.code
28 }
29
30 #[must_use]
32 pub const fn value(&self) -> u128 {
33 self.value
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 use crate::core::matter::code::NumberCode;
41
42 #[test]
43 fn number_picks_smallest_code() {
44 let n_short = Number::new(255);
45 assert_eq!(*n_short.code(), NumberCode::Short);
46 assert_eq!(n_short.value(), 255);
47
48 let n_long = Number::new(0xFFFF_FFFF);
49 assert_eq!(*n_long.code(), NumberCode::Long);
50
51 let n_big = Number::new(u128::from(u64::MAX));
52 assert_eq!(*n_big.code(), NumberCode::Big);
53 }
54
55 #[test]
56 fn number_zero() {
57 let n = Number::new(0);
58 assert_eq!(*n.code(), NumberCode::Short);
59 assert_eq!(n.value(), 0);
60 }
61}