use oneof::OneOf;
use strum::{Display, EnumCount, EnumIter, IntoStaticStr};
#[derive(OneOf, Debug, PartialEq, EnumIter, EnumCount, Display, IntoStaticStr)]
enum Event {
Request { id: u64, path: String },
Error(String),
Timeout,
}
fn main() {
let events = vec![
Event::Error("timeout".into()),
Event::Request {
id: 1,
path: "/".into(),
},
Event::Timeout,
Event::Request {
id: 2,
path: "/about".into(),
},
Event::Error("eof".into()),
];
let errors: Vec<&String> = events.iter().filter_map(|e| e.error()).collect();
println!("Errors (OneOf): {errors:?}");
let requests: Vec<&u64> = events
.iter()
.filter_map(|e| {
let req = e.request()?;
Some(req.id)
})
.collect();
println!("Request IDs (OneOf): {requests:?}");
let timeouts: Vec<()> = events.iter().filter_map(|e| e.timeout()).collect();
println!("Timeouts (OneOf): {timeouts:?}");
use strum::IntoEnumIterator;
let all_variants: Vec<&str> = Event::iter().map(|v| v.into()).collect();
println!("All variants (strum): {all_variants:?}");
println!("Variant count (strum): {}", Event::COUNT);
for event in &events {
if let Some(msg) = event.error() {
let name: &'static str = event.into();
println!(" Found {name}: {msg}");
}
}
}