use crate::std;
use std::fmt;
use crate::{
impl_default, impl_message_ops, impl_omnibus_nop_reply, len::QUERY_VARIANT_NAME_REPLY,
MessageOps, MessageType,
};
pub mod index {
pub const DATA: usize = 3;
}
#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct QueryVariantNameReply {
buf: [u8; QUERY_VARIANT_NAME_REPLY],
}
impl QueryVariantNameReply {
pub fn new() -> Self {
let mut message = Self {
buf: [0u8; QUERY_VARIANT_NAME_REPLY],
};
message.init();
message.set_message_type(MessageType::AuxCommand);
message
}
pub fn variant_name(&self) -> &str {
let etx_index = self.etx_index();
let buf = self.buf();
let name = std::str::from_utf8(buf[index::DATA..etx_index].as_ref()).unwrap_or("Unknown");
let end = if let Some(i) = name.find('\0') {
i
} else {
name.len()
};
&name[..end]
}
}
impl_default!(QueryVariantNameReply);
impl_message_ops!(QueryVariantNameReply);
impl_omnibus_nop_reply!(QueryVariantNameReply);
impl fmt::Display for QueryVariantNameReply {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"AckNak: {}, DeviceType: {}, MessageType: {}, VariantName: {}, Checksum: {}",
self.acknak(),
self.device_type(),
self.message_type(),
self.variant_name(),
self.checksum(),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Result;
#[test]
#[rustfmt::skip]
fn test_query_variant_name_reply_from_buf() -> Result<()> {
let msg_bytes = [
0x02, 0x25, 0x60,
b'S', b'C', b'N', b'L', b' ',
b'6', b'6', b'7', b'0', b'R',
b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0',
b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0', b'\0',
0x03, 0x22,
];
let mut msg = QueryVariantNameReply::new();
msg.from_buf(msg_bytes.as_ref())?;
assert_eq!(msg.message_type(), MessageType::AuxCommand);
assert_eq!(msg.variant_name(), "SCNL 6670R");
let msg_bytes = [
0x02, 0x25, 0x60,
b'S', b'C', b'N', b'L', b' ',
b'6', b'6', b'7', b'0', b'R', b' ',
b'P', b'l', b'u', b's', b' ',
b's', b'o', b'm', b'e', b' ',
b'l', b'o', b'n', b'g', b' ',
b's', b'u', b'f', b'f', b'i', b'x',
0x03, 0x11,
];
let mut msg = QueryVariantNameReply::new();
msg.from_buf(msg_bytes.as_ref())?;
assert_eq!(msg.message_type(), MessageType::AuxCommand);
assert_eq!(msg.variant_name(), "SCNL 6670R Plus some long suffix");
Ok(())
}
}