use derive_deftly::{Deftly, define_derive_deftly};
use tor_rtcompat::{CoarseDuration, CoarseInstant};
use tor_rtcompat::{CoarseTimeProvider, RealCoarseTimeProvider};
use web_time_compat::{Duration, Instant, SystemTime};
define_derive_deftly! {
CrateGetters:
${define REF ${if not(fmeta(getter_copy)) { & }}}
impl $ttype {
$(
${fattrs doc}
pub(crate) fn $fname(&self) -> $REF $ftype {
$REF self.$fname
}
)
}
}
#[derive(Clone, Debug, Deftly)]
#[derive_deftly(CrateGetters)]
pub(crate) struct MockTimeCore {
#[deftly(getter_copy)]
instant: Instant,
#[deftly(getter_copy)]
wallclock: SystemTime,
coarse: MockCoarseTimeProvider,
}
impl MockTimeCore {
pub(crate) fn new(instant: Instant, wallclock: SystemTime) -> Self {
MockTimeCore {
instant,
coarse: MockCoarseTimeProvider::new(),
wallclock,
}
}
pub(crate) fn advance(&mut self, d: Duration) {
self.instant += d;
self.wallclock += d;
self.coarse.advance(d);
}
pub(crate) fn jump_wallclock(&mut self, new_wallclock: SystemTime) {
self.wallclock = new_wallclock;
}
}
#[derive(Clone, Debug)]
pub(crate) struct MockCoarseTimeProvider {
started: CoarseInstant,
elapsed: Duration,
}
impl MockCoarseTimeProvider {
pub(crate) fn new() -> Self {
MockCoarseTimeProvider {
started: RealCoarseTimeProvider::new().now_coarse(),
elapsed: Duration::ZERO,
}
}
pub(crate) fn advance(&mut self, dur: Duration) {
self.elapsed += dur;
}
}
impl CoarseTimeProvider for MockCoarseTimeProvider {
fn now_coarse(&self) -> CoarseInstant {
self.started + CoarseDuration::from(self.elapsed)
}
}