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}