Skip to main content

lance_core/utils/
parse.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright The Lance Authors
3
4/// Parse a string into a boolean value.
5pub fn str_is_truthy(val: &str) -> bool {
6    val.eq_ignore_ascii_case("1")
7        | val.eq_ignore_ascii_case("true")
8        | val.eq_ignore_ascii_case("on")
9        | val.eq_ignore_ascii_case("yes")
10        | val.eq_ignore_ascii_case("y")
11}
12
13/// Parse a string into an optional boolean value.
14///
15/// Returns `Some(true)` for truthy values (1/true/on/yes/y, case-insensitive).
16/// Returns `Some(false)` for falsy values (0/false/off/no/n, case-insensitive).
17/// Returns `None` for unrecognized values.
18pub fn str_to_bool(val: &str) -> Option<bool> {
19    if str_is_truthy(val) {
20        Some(true)
21    } else if val.eq_ignore_ascii_case("0")
22        || val.eq_ignore_ascii_case("false")
23        || val.eq_ignore_ascii_case("off")
24        || val.eq_ignore_ascii_case("no")
25        || val.eq_ignore_ascii_case("n")
26    {
27        Some(false)
28    } else {
29        None
30    }
31}
32
33/// Parse an environment variable as a truthy-only boolean.
34///
35/// Returns `default_value` if the env var is not set.
36/// Returns `true` only for truthy values (1/true/on/yes/y, case-insensitive).
37/// Returns `false` for all other set values.
38pub fn parse_env_as_bool(env_var_name: &str, default_value: bool) -> bool {
39    std::env::var(env_var_name)
40        .ok()
41        .map(|value| str_is_truthy(value.trim()))
42        .unwrap_or(default_value)
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn test_str_to_bool_truthy() {
51        for val in [
52            "1", "true", "True", "TRUE", "on", "ON", "yes", "YES", "y", "Y",
53        ] {
54            assert_eq!(
55                str_to_bool(val),
56                Some(true),
57                "expected Some(true) for {:?}",
58                val
59            );
60        }
61    }
62
63    #[test]
64    fn test_str_to_bool_falsy() {
65        for val in [
66            "0", "false", "False", "FALSE", "off", "OFF", "no", "NO", "n", "N",
67        ] {
68            assert_eq!(
69                str_to_bool(val),
70                Some(false),
71                "expected Some(false) for {:?}",
72                val
73            );
74        }
75    }
76
77    #[test]
78    fn test_str_to_bool_unknown() {
79        for val in ["", "2", "maybe", "truthy", "nonsense"] {
80            assert_eq!(str_to_bool(val), None, "expected None for {:?}", val);
81        }
82    }
83}