pub trait Action {}
pub trait OptionalAction<A>: sealed::Sealed {
fn action(self) -> Option<A>;
}
mod sealed {
#[expect(
unnameable_types,
reason = "see https://predr.ag/blog/definitive-guide-to-sealed-traits-in-rust/"
)]
pub trait Sealed {}
}
impl sealed::Sealed for () {}
impl<A> OptionalAction<A> for () {
fn action(self) -> Option<A> {
None
}
}
impl<A: Action> sealed::Sealed for A {}
impl<A: Action> OptionalAction<A> for A {
fn action(self) -> Option<A> {
Some(self)
}
}
impl<A: Action> sealed::Sealed for Option<A> {}
impl<A: Action> OptionalAction<A> for Option<A> {
fn action(self) -> Self {
self
}
}