Skip to main content

void_core/support/
parse.rs

1//! Shared parsing utilities for configuration options.
2//!
3//! These functions centralize parsing logic that was previously duplicated
4//! across NAPI and CLI layers.
5
6use crate::shard::PaddingStrategy;
7use crate::{Result, VoidError};
8
9/// Parses a padding strategy from a string option.
10///
11/// Valid values:
12/// - `None` or `"power2"` → `PaddingStrategy::PowerOfTwo` (default)
13/// - `"none"` → `PaddingStrategy::None`
14/// - `"buckets"` → `PaddingStrategy::Buckets`
15/// - Numeric string → `PaddingStrategy::Fixed(n)`
16///
17/// # Examples
18///
19/// ```
20/// use void_core::support::parse::parse_padding_strategy;
21///
22/// assert!(parse_padding_strategy(None).is_ok());
23/// assert!(parse_padding_strategy(Some("power2")).is_ok());
24/// assert!(parse_padding_strategy(Some("none")).is_ok());
25/// assert!(parse_padding_strategy(Some("1024")).is_ok());
26/// assert!(parse_padding_strategy(Some("invalid")).is_err());
27/// ```
28pub fn parse_padding_strategy(padding: Option<&str>) -> Result<PaddingStrategy> {
29    match padding {
30        None | Some("power2") => Ok(PaddingStrategy::PowerOfTwo),
31        Some("none") => Ok(PaddingStrategy::None),
32        Some("buckets") => Ok(PaddingStrategy::Buckets),
33        Some(s) => s.parse::<usize>().map(PaddingStrategy::Fixed).map_err(|_| {
34            VoidError::Config(format!(
35                "invalid padding strategy: {}. Use 'none', 'power2', 'buckets', or a number",
36                s
37            ))
38        }),
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn parse_padding_strategy_defaults_to_power2() {
48        assert_eq!(
49            parse_padding_strategy(None).unwrap(),
50            PaddingStrategy::PowerOfTwo
51        );
52        assert_eq!(
53            parse_padding_strategy(Some("power2")).unwrap(),
54            PaddingStrategy::PowerOfTwo
55        );
56    }
57
58    #[test]
59    fn parse_padding_strategy_none() {
60        assert_eq!(
61            parse_padding_strategy(Some("none")).unwrap(),
62            PaddingStrategy::None
63        );
64    }
65
66    #[test]
67    fn parse_padding_strategy_buckets() {
68        assert_eq!(
69            parse_padding_strategy(Some("buckets")).unwrap(),
70            PaddingStrategy::Buckets
71        );
72    }
73
74    #[test]
75    fn parse_padding_strategy_fixed() {
76        assert_eq!(
77            parse_padding_strategy(Some("1024")).unwrap(),
78            PaddingStrategy::Fixed(1024)
79        );
80        assert_eq!(
81            parse_padding_strategy(Some("0")).unwrap(),
82            PaddingStrategy::Fixed(0)
83        );
84    }
85
86    #[test]
87    fn parse_padding_strategy_invalid() {
88        assert!(parse_padding_strategy(Some("invalid")).is_err());
89        assert!(parse_padding_strategy(Some("-1")).is_err());
90        assert!(parse_padding_strategy(Some("1.5")).is_err());
91    }
92}