Crates.io | trait_enum |
lib.rs | trait_enum |
version | 0.5.0 |
source | src |
created_at | 2018-04-06 14:54:47.217617 |
updated_at | 2020-08-31 17:43:54.983481 |
description | Easy enum wrapper that implements all traits that the wrapped objects implement |
homepage | https://github.com/trangar/trait_enum |
repository | https://github.com/trangar/trait_enum |
max_upload_size | |
id | 59275 |
size | 10,987 |
An enum wrapper for types that implement the same trait
The trait_enum
macro generates an enum
that manages
several objects.
These objects are expected to have the same trait impl
After which the enum will have a std::ops::Deref
impl
which returns a reference to that trait.
#[macro_use]
extern crate trait_enum;
pub trait CommonTrait {
fn test(&self) -> u32;
}
pub struct InnerOne;
impl CommonTrait for InnerOne {
fn test(&self) -> u32 {
1
}
}
pub struct InnerTwo;
impl CommonTrait for InnerTwo {
fn test(&self) -> u32 {
2
}
}
trait_enum!{
pub enum Combined: CommonTrait {
InnerOne,
InnerTwo,
}
}
fn main() {
use std::ops::Deref;
let combined = Combined::InnerOne(InnerOne);
let deref: &dyn CommonTrait = combined.deref();
assert_eq!(deref.test(), 1);
let combined = Combined::InnerTwo(InnerTwo);
let deref: &dyn CommonTrait = combined.deref();
assert_eq!(deref.test(), 2);
}