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");
}
}