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}