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