1pub use derive_variants_derive::EnumVariants;
2
3pub fn extract<T, Variant, Data>(target: T) -> Result<(Variant, Data), Error>
5where
6 T: ExtractVariant<Variant> + ExtractData<Variant, Data>,
7{
8 let variant = target.extract_variant();
9 let data = target.extract_data(&variant)?;
10 Ok((variant, data))
11}
12
13pub trait ExtractData<Variant, Data> {
14 fn extract_data(self, variant: &Variant) -> Result<Data, Error>;
15}
16
17pub trait ExtractVariant<Variant> {
18 fn extract_variant(&self) -> Variant;
19}
20
21#[derive(Debug, thiserror::Error)]
22pub enum Error {
23 #[error("The enum variant passed is not associated with the expected inner data")]
24 WrongVariantForData,
25 #[error("The enum variant passed is different than the variant of the actual enum")]
26 VariantMismatch,
27}