logs-wheel 0.3.1

Rolling log files with compression
Documentation
use std::path::Path;

use crate::formatters::CompactDateFormatter;

pub type DateStamp = u32;

pub fn date_stamp(path: &Path, filename_prefix: &str) -> Option<DateStamp> {
    let filename = path.file_name()?.to_str()?;

    if filename.get(0..filename_prefix.len()) != Some(filename_prefix) {
        return None;
    }

    if filename.as_bytes().get(filename_prefix.len()) != Some(&b'-') {
        return None;
    }

    let date_start_ind = filename_prefix.len() + 1;
    let extension_start_ind = date_start_ind + CompactDateFormatter::LEN;

    if filename.get(extension_start_ind..) != Some(".gz") {
        return None;
    }

    filename
        .get(date_start_ind..extension_start_ind)?
        .parse()
        .ok()
}

#[cfg(test)]
mod tests {
    use std::path::Path;

    use super::{date_stamp, DateStamp};

    #[test]
    fn valid_date_stamp() {
        fn test(path: &str, expected: DateStamp) {
            assert_eq!(date_stamp(Path::new(path), "test"), Some(expected));
        }

        test("test-20231109.gz", 20231109);
        test("test-91231110.gz", 91231110);
        test("test-20290101.gz", 20290101);
    }

    #[test]
    fn invalid_date_stamp() {
        fn test(path: &str) {
            assert_eq!(date_stamp(Path::new(path), "test"), None);
        }

        test("test-2023119.gz");
        test("test-20231109x.gz");
        test("test-2023119x.gz");
        test("test-x0231109.gz");
        test("test--20230209.gz");
        test("test-2-0230209.gz");
        test("test-20230209gz");
        test("test-20230209.g");
        test("test-20230209");
        test("test-20230209.z");
        test("-20230209.gz");
        test("testx-20230209.gz");
        test("xtest-20230209.gz");
        test("txst-20230209.gz");
    }
}