use std::convert::TryFrom; use crate::packets::{hci, lmp}; pub enum Either { Left(L), Right(R), } macro_rules! impl_try_from { ($T: path) => { impl TryFrom<$T> for Either where L: TryFrom<$T>, R: TryFrom<$T>, { type Error = (); fn try_from(value: $T) -> Result { let left = L::try_from(value.clone()); if let Ok(left) = left { return Ok(Either::Left(left)); } let right = R::try_from(value); if let Ok(right) = right { return Ok(Either::Right(right)); } Err(()) } } }; } impl_try_from!(lmp::PacketPacket); impl_try_from!(hci::CommandPacket);