Skip to main content

adze_concurrency_parse_core/
lib.rs

1//! String parsing helpers for concurrency cap configuration values.
2
3#![forbid(unsafe_op_in_unsafe_fn)]
4#![deny(missing_docs)]
5#![cfg_attr(feature = "strict_api", deny(unreachable_pub))]
6#![cfg_attr(not(feature = "strict_api"), warn(unreachable_pub))]
7#![cfg_attr(feature = "strict_docs", deny(missing_docs))]
8#![cfg_attr(not(feature = "strict_docs"), allow(missing_docs))]
9
10/// Parse an optional positive integer value, falling back to `default`.
11///
12/// `None`, parse failures, and `0` all resolve to `default`.
13#[must_use]
14pub fn parse_positive_usize_or_default(value: Option<&str>, default: usize) -> usize {
15    value
16        .and_then(|raw| raw.trim().parse::<usize>().ok())
17        .filter(|parsed| *parsed > 0)
18        .unwrap_or(default)
19}
20
21#[cfg(test)]
22mod tests {
23    use super::parse_positive_usize_or_default;
24
25    #[test]
26    fn parse_positive_usize_falls_back_when_missing_invalid_or_zero() {
27        assert_eq!(parse_positive_usize_or_default(None, 7), 7);
28        assert_eq!(parse_positive_usize_or_default(Some(""), 7), 7);
29        assert_eq!(parse_positive_usize_or_default(Some("nope"), 7), 7);
30        assert_eq!(parse_positive_usize_or_default(Some("0"), 7), 7);
31    }
32
33    #[test]
34    fn parse_positive_usize_accepts_trimmed_positive_input() {
35        assert_eq!(parse_positive_usize_or_default(Some(" 42 "), 7), 42);
36    }
37}