logs-wheel 0.3.1

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

use crate::date_stamp::DateStamp;

pub struct OldestPathFinder {
    pub oldest_path: Option<PathBuf>,
    pub n_old_files: usize,
}

impl<I> From<I> for OldestPathFinder
where
    I: Iterator<Item = (PathBuf, DateStamp)>,
{
    fn from(path_date_stamp_iter: I) -> Self {
        let (n_old_files, oldest_path, _) = path_date_stamp_iter.fold(
            (0, None, u32::MAX),
            |(n_old_files, oldest_path, min_date_stamp), (path, date_stamp)| {
                if date_stamp < min_date_stamp {
                    (n_old_files + 1, Some(path), date_stamp)
                } else {
                    (n_old_files + 1, oldest_path, min_date_stamp)
                }
            },
        );

        Self {
            oldest_path,
            n_old_files,
        }
    }
}

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

    use crate::date_stamp::DateStamp;

    use super::OldestPathFinder;

    #[test]
    fn correct() {
        fn test<const N: usize>(
            path_date_stamp_slice: [(&str, DateStamp); N],
            expected: Option<&str>,
        ) {
            let len = path_date_stamp_slice.len();

            let OldestPathFinder {
                oldest_path,
                n_old_files,
            } = OldestPathFinder::from(
                path_date_stamp_slice
                    .into_iter()
                    .map(|(path, date_stamp)| (PathBuf::from(path), date_stamp)),
            );

            assert_eq!(n_old_files, len);
            assert_eq!(oldest_path, expected.map(PathBuf::from));
        }

        test([], None);
        test([("1", 1)], Some("1"));
        test([("1", 1), ("2", 23)], Some("1"));
        test([("1", 20231110), ("2", 20221110)], Some("2"));
        test(
            [("1", 20231110), ("2", 20221110), ("3", 25550904)],
            Some("2"),
        );
        test(
            [("1", 20201110), ("2", 20221110), ("3", 25550904)],
            Some("1"),
        );
    }
}