use cc_talk_core::cc_talk::{Address, Header};
use super::super::command::{Command, ParseResponseError};
pub struct AddressPollCommand;
impl Command for AddressPollCommand {
type Response = u8;
fn header(&self) -> Header {
Header::AddressPoll
}
fn data(&self) -> &[u8] {
&[]
}
fn parse_response(
&self,
response_payload: &[u8],
) -> Result<Self::Response, ParseResponseError> {
if response_payload.len() != 1 {
return Err(ParseResponseError::DataLengthMismatch(
1,
response_payload.len(),
));
}
Ok(response_payload[0])
}
}
pub struct AddressClashCommand;
impl Command for AddressClashCommand {
type Response = u8;
fn header(&self) -> Header {
Header::AddressClash
}
fn data(&self) -> &[u8] {
&[]
}
fn parse_response(
&self,
response_payload: &[u8],
) -> Result<Self::Response, ParseResponseError> {
if response_payload.len() != 1 {
return Err(ParseResponseError::DataLengthMismatch(
1,
response_payload.len(),
));
}
Ok(response_payload[0])
}
}
#[derive(Debug)]
pub struct AddressChangeCommand {
buffer: [u8; 1],
}
impl AddressChangeCommand {
pub fn new(new_address: Address) -> Self {
AddressChangeCommand {
buffer: [match new_address {
Address::SingleAndRange(addr, _) => addr,
Address::Single(addr) => addr,
}; 1],
}
}
}
impl Command for AddressChangeCommand {
type Response = ();
fn header(&self) -> Header {
Header::AddressChange
}
fn data(&self) -> &[u8] {
&self.buffer
}
fn parse_response(
&self,
response_payload: &[u8],
) -> Result<Self::Response, ParseResponseError> {
match response_payload.is_empty() {
true => Ok(()),
false => Err(ParseResponseError::DataLengthMismatch(
0,
response_payload.len(),
)),
}
}
}
pub struct AddressRandomCommand;
impl Command for AddressRandomCommand {
type Response = ();
fn header(&self) -> Header {
Header::AddressRandom
}
fn data(&self) -> &[u8] {
&[]
}
fn parse_response(
&self,
response_payload: &[u8],
) -> Result<Self::Response, ParseResponseError> {
match response_payload.is_empty() {
true => Ok(()),
false => Err(ParseResponseError::DataLengthMismatch(
0,
response_payload.len(),
)),
}
}
}