From 3a992c4775433c8500a2b1879beed4fde391f23f Mon Sep 17 00:00:00 2001 From: Alex van de Sandt Date: Wed, 6 May 2026 19:36:19 -0500 Subject: [PATCH] Move command groups into modules --- src/command/bc125at/firmware_version.rs | 26 ++++++++ src/command/bc125at/mod.rs | 86 ++----------------------- src/command/bc125at/program_mode.rs | 4 ++ src/command/bc125at/volume.rs | 53 +++++++++++++++ 4 files changed, 89 insertions(+), 80 deletions(-) create mode 100644 src/command/bc125at/firmware_version.rs create mode 100644 src/command/bc125at/program_mode.rs create mode 100644 src/command/bc125at/volume.rs diff --git a/src/command/bc125at/firmware_version.rs b/src/command/bc125at/firmware_version.rs new file mode 100644 index 0000000..6612d5a --- /dev/null +++ b/src/command/bc125at/firmware_version.rs @@ -0,0 +1,26 @@ +use std::str::Utf8Error; + +use crate::command::{Response, command}; + +#[derive(Debug, thiserror::Error)] +pub enum FirmwareVersionError { + #[error("invalid UTF-8 bytes")] + Utf8Error(#[from] Utf8Error), +} + +#[derive(Debug)] +pub struct FirmwareVersion(pub String); + +impl Response for FirmwareVersion { + type Error = FirmwareVersionError; + fn deserialize(raw_values: &[bytes::Bytes]) -> Result { + let version = str::from_utf8(&raw_values[0])?.to_string(); + Ok(Self(version)) + } + + fn expected_field_count() -> usize { + 1 + } +} + +command!(b"VER": GetFirmwareVersion => FirmwareVersion); diff --git a/src/command/bc125at/mod.rs b/src/command/bc125at/mod.rs index 6ea5fa2..fc600ea 100644 --- a/src/command/bc125at/mod.rs +++ b/src/command/bc125at/mod.rs @@ -1,81 +1,7 @@ -use std::{num::ParseIntError, str::Utf8Error}; +mod firmware_version; +mod program_mode; +mod volume; -use crate::command::{OkResponse, Params, Response, command}; - -use super::ParamBuffer; - -command!(b"PRG": EnterProgramMode); -command!(b"EPG": ExitProgramMode); - -#[derive(Debug, thiserror::Error)] -pub enum FirmwareVersionError { - #[error("invalid UTF-8 bytes")] - Utf8Error(#[from] Utf8Error), -} - -#[derive(Debug)] -pub struct FirmwareVersion(pub String); - -impl Response for FirmwareVersion { - type Error = FirmwareVersionError; - fn deserialize(raw_values: &[bytes::Bytes]) -> Result { - let version = str::from_utf8(&raw_values[0])?.to_string(); - Ok(Self(version)) - } - - fn expected_field_count() -> usize { - 1 - } -} - -command!(b"VER": GetFirmwareVersion => FirmwareVersion); - -#[derive(Debug, thiserror::Error)] -pub enum VolumeLevelError { - #[error("invalid UTF-8 bytes")] - Utf8Error(#[from] Utf8Error), - #[error(transparent)] - Parse(#[from] ParseIntError), - #[error("volume must be between [0..15], got `{0}`")] - InvalidVolume(u8), -} - -#[derive(Debug)] -pub struct VolumeLevel(u8); - -impl VolumeLevel { - pub fn new(level: u8) -> Option { - (0..=15).contains(&level).then_some(Self(level)) - } -} - -impl Params for VolumeLevel { - fn count(&self) -> usize { - 1 - } - - fn total_size(&self) -> usize { - if self.0 >= 10 { 2 } else { 1 } - } - - fn serialize_to(&self, mut buffer: ParamBuffer) { - let mut serialized = itoa::Buffer::new(); - buffer.serialize_param(serialized.format(self.0).as_bytes()); - } -} - -impl Response for VolumeLevel { - type Error = VolumeLevelError; - - fn deserialize(raw_values: &[bytes::Bytes]) -> Result { - let level = str::from_utf8(&raw_values[0])?.parse()?; - Self::new(level).ok_or(VolumeLevelError::InvalidVolume(level)) - } - - fn expected_field_count() -> usize { - 1 - } -} - -command!(b"VOL": GetVolumeLevel => VolumeLevel); -command!(b"VOL": SetVolumeLevel(VolumeLevel) => OkResponse); +pub use firmware_version::GetFirmwareVersion; +pub use program_mode::{EnterProgramMode, ExitProgramMode}; +pub use volume::{GetVolumeLevel, SetVolumeLevel, VolumeLevel, VolumeLevelError}; diff --git a/src/command/bc125at/program_mode.rs b/src/command/bc125at/program_mode.rs new file mode 100644 index 0000000..61d89eb --- /dev/null +++ b/src/command/bc125at/program_mode.rs @@ -0,0 +1,4 @@ +use crate::command::command; + +command!(b"PRG": EnterProgramMode); +command!(b"EPG": ExitProgramMode); diff --git a/src/command/bc125at/volume.rs b/src/command/bc125at/volume.rs new file mode 100644 index 0000000..1ae6166 --- /dev/null +++ b/src/command/bc125at/volume.rs @@ -0,0 +1,53 @@ +use std::{num::ParseIntError, str::Utf8Error}; + +use crate::command::{OkResponse, ParamBuffer, Params, Response, command}; + +#[derive(Debug, thiserror::Error)] +pub enum VolumeLevelError { + #[error("invalid UTF-8 bytes")] + Utf8Error(#[from] Utf8Error), + #[error(transparent)] + Parse(#[from] ParseIntError), + #[error("volume must be between [0..15], got `{0}`")] + InvalidVolume(u8), +} + +#[derive(Debug)] +pub struct VolumeLevel(u8); + +impl VolumeLevel { + pub fn new(level: u8) -> Option { + (0..=15).contains(&level).then_some(Self(level)) + } +} + +impl Params for VolumeLevel { + fn count(&self) -> usize { + 1 + } + + fn total_size(&self) -> usize { + if self.0 >= 10 { 2 } else { 1 } + } + + fn serialize_to(&self, mut buffer: ParamBuffer) { + let mut serialized = itoa::Buffer::new(); + buffer.serialize_param(serialized.format(self.0).as_bytes()); + } +} + +impl Response for VolumeLevel { + type Error = VolumeLevelError; + + fn deserialize(raw_values: &[bytes::Bytes]) -> Result { + let level = str::from_utf8(&raw_values[0])?.parse()?; + Self::new(level).ok_or(VolumeLevelError::InvalidVolume(level)) + } + + fn expected_field_count() -> usize { + 1 + } +} + +command!(b"VOL": GetVolumeLevel => VolumeLevel); +command!(b"VOL": SetVolumeLevel(VolumeLevel) => OkResponse); -- 2.51.2