Skip to main content

formatparse_core/
datetime.rs

1//! Pure datetime-related string parsing (no PyO3).
2//!
3//! Shared helpers used by the PyO3 bindings; keep logic here when it has no
4//! Python dependency so it can be unit-tested from Rust alone.
5
6use crate::error::FormatParseError;
7
8/// Parse a fractional-second digit run to microseconds in `0..=999_999`.
9///
10/// Truncates to six digits when longer; right-pads with zeros when shorter
11/// (same rules as the previous `datetime::common::parse_microseconds` in pyo3).
12pub fn parse_microsecond_digits(micros_str: &str) -> Result<u32, FormatParseError> {
13    let micros_str = if micros_str.len() > 6 {
14        &micros_str[..6]
15    } else {
16        micros_str
17    };
18    let padded = format!("{:0<6}", micros_str);
19    padded.parse::<u32>().map_err(|_| {
20        FormatParseError::ConversionError(micros_str.to_string(), "microseconds".to_string())
21    })
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27
28    #[test]
29    fn parse_microsecond_digits_truncates_and_pads() {
30        assert_eq!(parse_microsecond_digits("123456").unwrap(), 123456);
31        assert_eq!(parse_microsecond_digits("123").unwrap(), 123000);
32        assert_eq!(parse_microsecond_digits("12").unwrap(), 120000);
33        assert_eq!(parse_microsecond_digits("1234567").unwrap(), 123456);
34    }
35}