use edyn::edyn; #[edyn(Application)] enum App { Menu, #[cfg(test)] DebugClock, #[cfg(not(test))] Clock, } #[edyn] trait Application { fn run(self) -> usize; } struct Menu; #[cfg(test)] struct DebugClock; #[cfg(not(test))] struct Clock; impl Application for Menu { fn run(self) -> usize { 0 } } #[cfg(test)] impl Application for DebugClock { fn run(self) -> usize { 1 } } #[cfg(not(test))] impl Application for Clock { fn run(self) -> usize { 2 } } #[test] fn main() { use std::convert::TryInto; let menu = Menu; let app: App = menu.into(); let menu: Menu = app.try_into().unwrap(); assert_eq!(menu.run(), 0); #[cfg(test)] { let clock = DebugClock; let app: App = clock.into(); let clock: DebugClock = app.try_into().unwrap(); assert_eq!(clock.run(), 1); } #[cfg(not(test))] { let clock = Clock; let app: App = clock.into(); let clock: Clock = app.try_into().unwrap(); assert_eq!(clock.run(), 2); } }