aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-02-18 11:39:39 +0000
committerRobin Krahl <robin.krahl@ireas.org>2019-02-18 15:30:25 +0100
commit8d9241e033e1babeccee49ab848c15edd8831516 (patch)
tree8b7eca5101f299335233038eb80da685ae1ca452 /src
parent7da90438dd7851f66abfa81eba2eeb36ff9c9c25 (diff)
downloadntw-8d9241e033e1babeccee49ab848c15edd8831516.tar.gz
ntw-8d9241e033e1babeccee49ab848c15edd8831516.tar.bz2
Add enum_u8 macro to simplify enum conversion
We need several enums that map to a u8 value. This patch adds the enum_u8 macro that automatically derives the From and TryFrom macros for an enum to make these conversions easier. As TryFrom is not stable yet, we add our own TryFrom trait.
Diffstat (limited to 'src')
-rw-r--r--src/hid.rs32
-rw-r--r--src/main.rs3
-rw-r--r--src/util.rs43
3 files changed, 57 insertions, 21 deletions
diff --git a/src/hid.rs b/src/hid.rs
index 4f1d506..6274e7f 100644
--- a/src/hid.rs
+++ b/src/hid.rs
@@ -11,30 +11,20 @@ use usb_device::Result;
const INTERFACE_CLASS_HID: u8 = 0x03;
-#[derive(Clone, Copy, Debug, PartialEq)]
-#[repr(u8)]
-pub enum Subclass {
- None = 0x00,
- BootInterface = 0x01,
-}
-
-impl From<Subclass> for u8 {
- fn from(subclass: Subclass) -> u8 {
- subclass as u8
+enum_u8! {
+ #[derive(Clone, Copy, Debug, PartialEq)]
+ pub enum Subclass {
+ None = 0x00,
+ BootInterface = 0x01,
}
}
-#[derive(Clone, Copy, Debug, PartialEq)]
-#[repr(u8)]
-pub enum Protocol {
- None = 0x00,
- Keyboard = 0x01,
- Mouse = 0x02,
-}
-
-impl From<Protocol> for u8 {
- fn from(protocol: Protocol) -> u8 {
- protocol as u8
+enum_u8! {
+ #[derive(Clone, Copy, Debug, PartialEq)]
+ pub enum Protocol {
+ None = 0x00,
+ Keyboard = 0x01,
+ Mouse = 0x02,
}
}
diff --git a/src/main.rs b/src/main.rs
index b0ecafd..3857967 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,6 +6,9 @@
extern crate panic_halt;
+#[macro_use]
+mod util;
+
mod device;
mod hid;
diff --git a/src/util.rs b/src/util.rs
new file mode 100644
index 0000000..4fc4448
--- /dev/null
+++ b/src/util.rs
@@ -0,0 +1,43 @@
+// Copyright 2019 Robin Krahl <robin.krahl@ireas.org>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+use core::marker::Sized;
+
+macro_rules! enum_u8 {
+ (
+ $(#[$outer:meta])*
+ pub enum $name:ident {
+ $($var:ident = $num:expr),+
+ $(,)*
+ }
+ ) => {
+ $(#[$outer])*
+ #[repr(u8)]
+ pub enum $name {
+ $(
+ $var = $num,
+ )*
+ }
+
+ impl crate::util::TryFrom<u8> for $name {
+ fn try_from(val: u8) -> ::core::result::Result<Self, ()> {
+ match val {
+ $(
+ $num => Ok($name::$var),
+ )*
+ _ => Err(())
+ }
+ }
+ }
+
+ impl From<$name> for u8 {
+ fn from(val: $name) -> u8 {
+ val as u8
+ }
+ }
+ };
+}
+
+pub trait TryFrom<T>: Sized {
+ fn try_from(val: T) -> Result<Self, ()>;
+}