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
24pub trait FromIdempotentIgnored {
25 fn from_ignored() -> Self;
26}
27
28impl<T> FromIdempotentIgnored for Idempotent<T> {
29 fn from_ignored() -> Self {
30 Idempotent::Ignored
31 }
32}
33
34impl<T, E> FromIdempotentIgnored for Result<Idempotent<T>, E> {
35 fn from_ignored() -> Self {
36 Ok(Idempotent::Ignored)
37 }
38}