rfe 0.1.0

Communicate with RF Explorer spectrum analyzers and signal generators over USB serial
Documentation
use super::{Config, DspMode, InputStage, Model, Sweep, TrackingStatus};
use crate::common::MessageParseError;
use crate::rf_explorer::{ScreenData, SerialNumber, SetupInfo};

#[derive(Debug, Clone, PartialEq)]
pub(crate) enum Message {
    Config(Config),
    DspMode(DspMode),
    InputStage(InputStage),
    ScreenData(ScreenData),
    SerialNumber(SerialNumber),
    SetupInfo(SetupInfo<Model>),
    Sweep(Sweep),
    TrackingStatus(TrackingStatus),
}

impl<'a> TryFrom<&'a [u8]> for Message {
    type Error = MessageParseError<'a>;

    #[tracing::instrument(ret, err, fields(bytes_as_string = String::from_utf8_lossy(bytes).as_ref()))]
    fn try_from(bytes: &'a [u8]) -> Result<Self, Self::Error> {
        if bytes.starts_with(Config::PREFIX) {
            Ok(Message::Config(Config::try_from(bytes)?))
        } else if bytes.starts_with(DspMode::PREFIX) {
            Ok(Message::DspMode(DspMode::try_from(bytes)?))
        } else if bytes.starts_with(InputStage::PREFIX) {
            Ok(Message::InputStage(InputStage::try_from(bytes)?))
        } else if bytes.starts_with(ScreenData::PREFIX) {
            Ok(Message::ScreenData(ScreenData::try_from(bytes)?))
        } else if bytes.starts_with(SerialNumber::PREFIX) {
            Ok(Message::SerialNumber(SerialNumber::try_from(bytes)?))
        } else if bytes.starts_with(SetupInfo::<Model>::PREFIX) {
            Ok(Message::SetupInfo(SetupInfo::<Model>::try_from(bytes)?))
        } else if bytes.starts_with(Sweep::STANDARD_PREFIX)
            || bytes.starts_with(Sweep::EXT_PREFIX)
            || bytes.starts_with(Sweep::LARGE_PREFIX)
        {
            Ok(Message::Sweep(Sweep::try_from(bytes)?))
        } else if bytes.starts_with(TrackingStatus::PREFIX) {
            Ok(Message::TrackingStatus(TrackingStatus::try_from(bytes)?))
        } else {
            Err(MessageParseError::UnknownMessageType)
        }
    }
}