reifydb_value/config/
f32.rs1use super::Config;
5
6impl Config {
7 pub fn f32(&self, key: &str) -> Option<f32> {
8 self.opt_coerce(key)
9 }
10
11 pub fn require_f32(&self, key: &str) -> f32 {
12 self.opt_coerce(key).unwrap_or_else(|| self.missing(key, "a number"))
13 }
14
15 pub fn f32_or(&self, key: &str, default: f32) -> f32 {
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_both_float_widths() {
27 let cfg = config(vec![("f4", Value::float4(0.5f32)), ("f8", Value::float8(0.25))]);
28 assert_eq!(cfg.f32("f4"), Some(0.5));
29 assert_eq!(cfg.f32("f8"), Some(0.25), "Float8 narrows to f32");
30 }
31
32 #[test]
33 fn casts_integer_widths() {
34 let cfg = config(vec![("u", Value::Uint8(4)), ("i", Value::Int2(-3)), ("big", Value::Uint16(5))]);
35 assert_eq!(cfg.f32("u"), Some(4.0));
36 assert_eq!(cfg.f32("i"), Some(-3.0));
37 assert_eq!(cfg.f32("big"), Some(5.0), "Uint16 coerces to f32");
38 }
39
40 #[test]
41 fn rejects_non_numeric_values() {
42 let cfg = config(vec![("s", Value::utf8("1.5")), ("b", Value::Boolean(true))]);
43 assert_eq!(cfg.f32("s"), None, "strings are not numbers");
44 assert_eq!(cfg.f32("b"), None, "booleans are not numbers");
45 }
46
47 #[test]
48 fn or_and_require_behavior() {
49 let cfg = config(vec![("present", Value::float4(0.5f32))]);
50 assert_eq!(cfg.f32_or("present", 1.0), 0.5);
51 assert_eq!(cfg.f32_or("absent", 0.25), 0.25);
52 assert_eq!(cfg.require_f32("present"), 0.5);
53 }
54
55 #[test]
56 #[should_panic(expected = "is missing or not a number")]
57 fn require_panics_when_missing() {
58 let cfg = config(vec![]);
59 cfg.require_f32("k");
60 }
61}