derive_variants/
lib.rs

1pub use derive_variants_derive::EnumVariants;
2
3/// Extract data in an enum into (variant, inner_data)
4pub 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}