1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use std::time::{Instant, Duration};
pub struct MaybeExpired<T> {
    value: Option<T>,
    expire_at: Instant
}

impl<T> MaybeExpired<T> {
    pub fn new() -> Self {
        Self {
            value: None,
            expire_at: Instant::now()
        }
    }

    pub fn get(&self) -> Option<&T> {
        if self.expire_at > Instant::now() {
            self.value.as_ref()
        } else {
            None
        }
    }

    pub fn set(&mut self, value: T, expire_after: Duration) {
        self.value.replace(value);
        self.expire_at = Instant::now() + expire_after
    }

    pub fn expire(&mut self) {
        self.expire_at = Instant::now();
        // moveout ownership
        self.value = None;
    }
}

#[cfg(test)]
mod tests;