es_entity/
idempotent.rs

1#[must_use]
2pub enum Idempotent<T> {
3    Executed(T),
4    Ignored,
5}
6
7impl<T> Idempotent<T> {
8    pub fn was_ignored(&self) -> bool {
9        matches!(self, Idempotent::Ignored)
10    }
11
12    pub fn did_execute(&self) -> bool {
13        matches!(self, Idempotent::Executed(_))
14    }
15
16    pub fn unwrap(self) -> T {
17        match self {
18            Idempotent::Executed(t) => t,
19            Idempotent::Ignored => panic!("Idempotent::Ignored"),
20        }
21    }
22
23    pub fn expect(self, msg: &str) -> T {
24        match self {
25            Idempotent::Executed(val) => val,
26            Idempotent::Ignored => panic!("{}", msg),
27        }
28    }
29}
30
31pub trait FromIdempotentIgnored {
32    fn from_ignored() -> Self;
33}
34
35impl<T> FromIdempotentIgnored for Idempotent<T> {
36    fn from_ignored() -> Self {
37        Idempotent::Ignored
38    }
39}
40
41impl<T, E> FromIdempotentIgnored for Result<Idempotent<T>, E> {
42    fn from_ignored() -> Self {
43        Ok(Idempotent::Ignored)
44    }
45}