adze_concurrency_parse_core/
lib.rs1#![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#[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}