Skip to main content

reifydb_value/config/
f32.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}