ev3dev_lang_rust/
findable.rs1#[macro_export]
24macro_rules! findable {
25 ($class_name:expr, [$( $driver_name:expr ),*], $port: ty, $debug_name:expr, $port_prefix:expr) => {
26 fn map_error(e: Ev3Error) -> Ev3Error {
27 match e {
28 e @ Ev3Error::InternalError { .. } => e,
29 Ev3Error::NotConnected { device: _, port } => Ev3Error::NotConnected {
30 device: $debug_name.to_owned(),
31 port,
32 },
33 Ev3Error::MultipleMatches { device: _, ports } => Ev3Error::MultipleMatches {
34 device: $debug_name.to_owned(),
35 ports: ports
36 .iter()
37 .map(|item| <$port>::format_name(item))
38 .collect(),
39 },
40 }
41 }
42
43 #[allow(clippy::vec_init_then_push)]
45 pub fn get(port: $port) -> Ev3Result<Self> {
46 let mut driver_name_vec = Vec::new();
47 $(
48 driver_name_vec.push($driver_name);
49 )*
50
51 let name = Driver::find_name_by_port_and_driver($class_name, &port, &driver_name_vec)
52 .map_err(Self::map_error)?;
53
54 Ok(Self::new(Driver::new($class_name, &name)))
55 }
56
57 #[allow(clippy::vec_init_then_push)]
59 pub fn find() -> Ev3Result<Self> {
60 let mut driver_name_vec = Vec::new();
61 $(
62 driver_name_vec.push($driver_name);
63 )*
64
65 let name =
66 Driver::find_name_by_driver($class_name, &driver_name_vec).map_err(Self::map_error)?;
67
68 Ok(Self::new(Driver::new($class_name, &name)))
69 }
70
71 #[allow(clippy::vec_init_then_push)]
73 pub fn list() -> Ev3Result<Vec<Self>> {
74 let mut driver_name_vec = Vec::new();
75 $(
76 driver_name_vec.push($driver_name);
77 )*
78
79 Ok(Driver::find_names_by_driver($class_name, &driver_name_vec)?
80 .iter()
81 .map(|name| Self::new(Driver::new($class_name, &name)))
82 .collect())
83 }
84 };
85}