• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::convert::TryFrom;
2 
3 use crate::packets::{hci, lmp};
4 
5 pub enum Either<L, R> {
6     Left(L),
7     Right(R),
8 }
9 
10 macro_rules! impl_try_from {
11     ($T: path) => {
12         impl<L, R> TryFrom<$T> for Either<L, R>
13         where
14             L: TryFrom<$T>,
15             R: TryFrom<$T>,
16         {
17             type Error = ();
18 
19             fn try_from(value: $T) -> Result<Self, Self::Error> {
20                 let left = L::try_from(value.clone());
21                 if let Ok(left) = left {
22                     return Ok(Either::Left(left));
23                 }
24                 let right = R::try_from(value);
25                 if let Ok(right) = right {
26                     return Ok(Either::Right(right));
27                 }
28                 Err(())
29             }
30         }
31     };
32 }
33 
34 impl_try_from!(lmp::PacketPacket);
35 impl_try_from!(hci::CommandPacket);
36