From 41bfe70b6f08aea9844abd4ad41b6c1fc3b01887 Mon Sep 17 00:00:00 2001 From: Alex van de Sandt Date: Wed, 29 Apr 2026 16:03:19 -0500 Subject: [PATCH] Add a macro to generate basic commands --- src/command/bc125at.rs | 31 +++++++------------------------ src/command/macros.rs | 30 ++++++++++++++++++++++++++++++ src/command/mod.rs | 9 +++++---- src/lib.rs | 9 ++++++--- 4 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 src/command/macros.rs diff --git a/src/command/bc125at.rs b/src/command/bc125at.rs index a57c67e..1f7cf6c 100644 --- a/src/command/bc125at.rs +++ b/src/command/bc125at.rs @@ -1,19 +1,12 @@ use std::str::Utf8Error; -use crate::command::{Command, NoParams, OkResponse, Response}; +use crate::{ + NoParams, OkResponse, + command::{Command, Response, command}, +}; -#[derive(Debug)] -pub struct EnterProgramMode; - -impl Command<'static> for EnterProgramMode { - const TEXT: &'static [u8] = b"EPG"; - type Params = NoParams; - type Response = OkResponse; - - fn param_set(&self) -> Self::Params { - NoParams - } -} +command!(b"PRG": EnterProgramMode); +command!(b"EPG": ExitProgramMode); #[derive(Debug, thiserror::Error)] pub enum FirmwareVersionError { @@ -36,14 +29,4 @@ impl Response for FirmwareVersion { } } -pub struct GetFirmwareVersion; - -impl Command<'static> for GetFirmwareVersion { - const TEXT: &'static [u8] = b"VER"; - type Params = NoParams; - type Response = FirmwareVersion; - - fn param_set(&self) -> Self::Params { - NoParams - } -} +command!(b"VER": GetFirmwareVersion => FirmwareVersion); diff --git a/src/command/macros.rs b/src/command/macros.rs new file mode 100644 index 0000000..ae837ab --- /dev/null +++ b/src/command/macros.rs @@ -0,0 +1,30 @@ +macro_rules! command { + ($text:literal: $name:ident) => { + pub struct $name; + + impl Command<'static> for $name { + const TEXT: &'static [u8] = $text; + type Params = NoParams; + type Response = OkResponse; + + fn param_set(&self) -> Self::Params { + NoParams + } + } + }; + ($text:literal: $name:ident => $response:ident) => { + pub struct $name; + + impl Command<'static> for $name { + const TEXT: &'static [u8] = $text; + type Params = NoParams; + type Response = $response; + + fn param_set(&self) -> Self::Params { + NoParams + } + } + }; +} + +pub(crate) use command; diff --git a/src/command/mod.rs b/src/command/mod.rs index 2a5343a..d1c2c26 100644 --- a/src/command/mod.rs +++ b/src/command/mod.rs @@ -1,11 +1,12 @@ pub mod bc125at; -mod no_params; -mod ok_response; +#[macro_use] +mod macros; +pub mod no_params; +pub mod ok_response; use bytes::{Bytes, BytesMut}; -pub(crate) use no_params::NoParams; -pub(crate) use ok_response::OkResponse; +pub(crate) use macros::command; pub trait Command<'p> { const TEXT: &'static [u8]; diff --git a/src/lib.rs b/src/lib.rs index 54350cb..3130324 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,9 @@ mod codec; mod command; mod scanner; -pub use crate::command::bc125at; -pub use crate::command::{Command, Param, ParamSet, Response}; -pub use crate::scanner::{Scanner, ScannerError}; +pub use crate::{ + command::{ + Command, Param, ParamSet, Response, bc125at, no_params::NoParams, ok_response::OkResponse, + }, + scanner::{Scanner, ScannerError}, +}; -- 2.51.2