ralph_workflow/config/
parser.rs1#[must_use]
21pub fn parse_env_bool(value: &str) -> Option<bool> {
22 let normalized = value.trim().to_ascii_lowercase();
23 match normalized.as_str() {
24 "1" | "true" | "yes" | "y" | "on" => Some(true),
25 "0" | "false" | "no" | "n" | "off" => Some(false),
26 _ => None,
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 #[test]
35 fn test_parse_env_bool() {
36 assert_eq!(parse_env_bool("1"), Some(true));
37 assert_eq!(parse_env_bool("true"), Some(true));
38 assert_eq!(parse_env_bool(" TRUE "), Some(true));
39 assert_eq!(parse_env_bool("on"), Some(true));
40 assert_eq!(parse_env_bool("yes"), Some(true));
41
42 assert_eq!(parse_env_bool("0"), Some(false));
43 assert_eq!(parse_env_bool("false"), Some(false));
44 assert_eq!(parse_env_bool(" FALSE "), Some(false));
45 assert_eq!(parse_env_bool("off"), Some(false));
46 assert_eq!(parse_env_bool("no"), Some(false));
47
48 assert_eq!(parse_env_bool(""), None);
49 assert_eq!(parse_env_bool("maybe"), None);
50 }
51}
52
53#[cfg(test)]
54mod proptest_parsers {
55 use super::parse_env_bool;
56 use proptest::prelude::*;
57
58 proptest! {
59 #[test]
61 fn parse_env_bool_never_panics(s in ".*") {
62 let _ = parse_env_bool(&s);
63 }
64
65 #[test]
67 fn parse_env_bool_truthy_values(
68 val in prop_oneof!["1", "true", "yes", "y", "on",
69 "TRUE", "YES", "ON", "True", "Yes"],
70 prefix in "[ \t]*",
71 suffix in "[ \t]*",
72 ) {
73 let padded = format!("{prefix}{val}{suffix}");
74 prop_assert_eq!(parse_env_bool(&padded), Some(true));
75 }
76
77 #[test]
79 fn parse_env_bool_falsy_values(
80 val in prop_oneof!["0", "false", "no", "n", "off",
81 "FALSE", "NO", "OFF", "False", "No"],
82 prefix in "[ \t]*",
83 suffix in "[ \t]*",
84 ) {
85 let padded = format!("{prefix}{val}{suffix}");
86 prop_assert_eq!(parse_env_bool(&padded), Some(false));
87 }
88
89 #[test]
91 fn parse_env_bool_result_is_valid(s in ".*") {
92 let result = parse_env_bool(&s);
93 prop_assert!(result == Some(true) || result == Some(false) || result.is_none());
94 }
95 }
96}