use std::time::SystemTime;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub(crate) enum TimeSource {
FromSource,
Override(SystemTime),
ClampTo(SystemTime),
}
impl TimeSource {
#[must_use]
pub(crate) fn resolve(&self, source: Option<SystemTime>) -> Option<SystemTime> {
match self {
Self::FromSource => source,
Self::Override(t) => Some(*t),
Self::ClampTo(t) => source.map(|s| (*t).min(s)),
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub(crate) enum TimestampStrategy {
NoPreserve,
Preserve {
mtime: TimeSource,
ctime: TimeSource,
atime: TimeSource,
},
}
impl TimestampStrategy {
#[must_use]
pub(crate) const fn preserve() -> Self {
Self::Preserve {
mtime: TimeSource::FromSource,
ctime: TimeSource::FromSource,
atime: TimeSource::FromSource,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
fn time(secs: u64) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(secs)
}
#[test]
fn time_source_from_source() {
let source = TimeSource::FromSource;
assert_eq!(source.resolve(Some(time(100))), Some(time(100)));
assert_eq!(source.resolve(None), None);
}
#[test]
fn time_source_override() {
let source = TimeSource::Override(time(50));
assert_eq!(source.resolve(Some(time(100))), Some(time(50)));
assert_eq!(source.resolve(None), Some(time(50)));
}
#[test]
fn time_source_clamp_to() {
let source = TimeSource::ClampTo(time(50));
assert_eq!(source.resolve(Some(time(100))), Some(time(50)));
assert_eq!(source.resolve(Some(time(30))), Some(time(30)));
assert_eq!(source.resolve(None), None);
}
}