enum_downcast/
lib.rs

1#![no_std]
2
3#[cfg(feature = "derive")]
4pub use enum_downcast_derive::EnumDowncast;
5
6pub trait IntoVariant<T> {
7    fn into_variant(self) -> Result<T, Self>
8    where
9        Self: Sized;
10}
11
12pub trait AsVariant<T> {
13    fn as_variant(&self) -> Option<&T>;
14}
15
16pub trait AsVariantMut<T> {
17    fn as_variant_mut(&mut self) -> Option<&mut T>;
18}
19
20pub trait EnumDowncast {
21    fn enum_downcast<T>(self) -> Result<T, Self>
22    where
23        Self: IntoVariant<T> + Sized;
24
25    fn enum_downcast_ref<T>(&self) -> Option<&T>
26    where
27        Self: AsVariant<T>;
28
29    fn enum_downcast_mut<T>(&mut self) -> Option<&mut T>
30    where
31        Self: AsVariantMut<T>;
32}
33
34impl<Enum> EnumDowncast for Enum {
35    fn enum_downcast<T>(self) -> Result<T, Self>
36    where
37        Self: IntoVariant<T> + Sized,
38    {
39        self.into_variant()
40    }
41
42    fn enum_downcast_ref<T>(&self) -> Option<&T>
43    where
44        Self: AsVariant<T>,
45    {
46        self.as_variant()
47    }
48
49    fn enum_downcast_mut<T>(&mut self) -> Option<&mut T>
50    where
51        Self: AsVariantMut<T>,
52    {
53        self.as_variant_mut()
54    }
55}