Skip to main content

reifydb_value/config/
u32.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use super::Config;
5
6impl Config {
7	pub fn u32(&self, key: &str) -> Option<u32> {
8		self.opt_coerce(key)
9	}
10
11	pub fn require_u32(&self, key: &str) -> u32 {
12		self.opt_coerce(key).unwrap_or_else(|| self.missing(key, "an unsigned integer"))
13	}
14
15	pub fn u32_or(&self, key: &str, default: u32) -> u32 {
16		self.opt_coerce(key).unwrap_or(default)
17	}
18}
19
20#[cfg(test)]
21mod tests {
22	use super::super::testutil::config;
23	use crate::value::Value;
24
25	#[test]
26	fn casts_integer_widths_that_fit() {
27		let cfg = config(vec![
28			("a", Value::Uint1(1)),
29			("b", Value::Uint4(60)),
30			("c", Value::Int2(7)),
31			("d", Value::Uint8(120)),
32		]);
33		assert_eq!(cfg.u32("a"), Some(1));
34		assert_eq!(cfg.u32("b"), Some(60));
35		assert_eq!(cfg.u32("c"), Some(7), "non-negative signed coerces to u32");
36		assert_eq!(cfg.u32("d"), Some(120));
37	}
38
39	#[test]
40	fn rejects_value_above_u32_max() {
41		let cfg = config(vec![("a", Value::Uint8(u32::MAX as u64 + 1))]);
42		assert_eq!(cfg.u32("a"), None, "value exceeding u32::MAX is range-checked, not silently truncated");
43	}
44
45	#[test]
46	fn rejects_negative_and_mistyped() {
47		let cfg = config(vec![("neg", Value::Int4(-3)), ("s", Value::utf8("x"))]);
48		assert_eq!(cfg.u32("neg"), None, "negative does not coerce to unsigned");
49		assert_eq!(cfg.u32("s"), None, "string is not an integer");
50	}
51
52	#[test]
53	fn or_and_require_behavior() {
54		let cfg = config(vec![("present", Value::Uint4(9))]);
55		assert_eq!(cfg.u32_or("present", 1), 9);
56		assert_eq!(cfg.u32_or("absent", 1), 1);
57		assert_eq!(cfg.require_u32("present"), 9);
58	}
59
60	#[test]
61	#[should_panic(expected = "is missing or not an unsigned integer")]
62	fn require_panics_when_missing() {
63		let cfg = config(vec![]);
64		cfg.require_u32("k");
65	}
66}