Expand description
Macros that make it more convenient to work with enums with variants that all implement the same trait(s).
with_methods allows you to easily delegate method calls to enum variants:
//! The variant of the writer is dynamically selected with an environment variable.
//! Using the macro, we can use the enum with the convenience of a trait object.
use std::{
env,
fs::File,
io::{Cursor, Write},
};
#[impl_enum::with_methods {
fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()>
pub fn write(&mut self, buf: &[u8]) -> std::io::Result<usize>
}]
pub enum Writer {
Cursor(Cursor<Vec<u8>>),
File { file: File },
}
fn get_writer() -> Writer {
if let Ok(path) = env::var("WRITER_FILE") {
Writer::File {
file: File::create(path).unwrap(),
}
} else {
Writer::Cursor(Cursor::new(vec![]))
}
}
fn main() {
let mut writer = get_writer();
writer.write_all(b"hello!").unwrap();
}
as_dyn allows you to treat the enum as a trait object when necessary:
//! The variant of the writer is dynamically selected with an environment variable.
//! Using the macro, we can conveniently turn the enum into a trait object when necessary.
use std::{
fmt::Debug,
fs::File,
io::{Cursor, Write},
};
#[impl_enum::as_dyn(Debug, Write)]
pub enum Writer {
Cursor(Cursor<Vec<u8>>),
File { file: File },
}
fn get_writer() -> Writer {
if let Ok(path) = std::env::var("WRITER_FILE") {
Writer::File {
file: File::create(path).unwrap(),
}
} else {
Writer::Cursor(Cursor::new(vec![]))
}
}
fn main() {
let mut writer = get_writer();
let dyn_debug = writer.as_dyn_debug();
println!("{:?}", dyn_debug);
let dyn_writer_mut = writer.as_dyn_write_mut();
dyn_writer_mut.write_all(b"hello!").unwrap();
let box_dyn_debug = writer.into_dyn_debug();
println!("{:?}", box_dyn_debug);
}
Attribute Macros
- Generates methods for an enum that match on the enum and return the variant’s first field as a trait object.
- Generates methods for an enum that match on the enum and call given the method with the variant’s first field.