reifydb_value/config/
u32.rs1use 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}