Skip to main content

reifydb_value/config/
string.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use super::Config;
5
6impl Config {
7	pub fn str(&self, key: &str) -> Option<String> {
8		self.opt(key)
9	}
10
11	pub fn require_str(&self, key: &str) -> String {
12		self.opt(key).unwrap_or_else(|| self.missing(key, "a string"))
13	}
14
15	pub fn str_or(&self, key: &str, default: &str) -> String {
16		self.opt::<String>(key).unwrap_or_else(|| default.to_string())
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_utf8_values() {
27		let cfg = config(vec![("s", Value::utf8("vwap"))]);
28		assert_eq!(cfg.str("s").as_deref(), Some("vwap"));
29	}
30
31	#[test]
32	fn rejects_non_string_values() {
33		let cfg = config(vec![("n", Value::Uint4(1)), ("f", Value::float8(1.0)), ("b", Value::Boolean(true))]);
34		assert_eq!(cfg.str("n"), None, "integers are not strings");
35		assert_eq!(cfg.str("f"), None, "floats are not strings");
36		assert_eq!(cfg.str("b"), None, "booleans are not strings");
37	}
38
39	#[test]
40	fn str_or_returns_default_on_absent_or_mistyped() {
41		let cfg = config(vec![("present", Value::utf8("vwap")), ("wrong", Value::Uint4(1))]);
42		assert_eq!(cfg.str_or("present", "base_mint"), "vwap");
43		assert_eq!(cfg.str_or("absent", "base_mint"), "base_mint");
44		assert_eq!(cfg.str_or("wrong", "base_mint"), "base_mint", "mistyped falls back to default");
45	}
46
47	#[test]
48	fn require_returns_value_when_present() {
49		let cfg = config(vec![("col", Value::utf8("vwap"))]);
50		assert_eq!(cfg.require_str("col"), "vwap");
51	}
52
53	#[test]
54	#[should_panic(expected = "is missing or not a string")]
55	fn require_str_panics_on_wrong_type() {
56		let cfg = config(vec![("k", Value::Uint4(1))]);
57		cfg.require_str("k");
58	}
59}