Generate response structs from packet
This commit is contained in:
parent
7b7c85f976
commit
9a2b76864c
@ -104,9 +104,11 @@ pub fn calculate_checksum(data: &[u8]) -> u8 {
|
|||||||
return checksum;
|
return checksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ImprovDataToPacket {
|
pub trait ImprovDataPacketType {
|
||||||
const packet_type: PacketType;
|
const packet_type: PacketType;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait ImprovDataToPacket: ImprovDataPacketType {
|
||||||
fn to_bytes(&self) -> Vec<u8>;
|
fn to_bytes(&self) -> Vec<u8>;
|
||||||
|
|
||||||
fn to_packet(&self) -> ImprovPacket {
|
fn to_packet(&self) -> ImprovPacket {
|
||||||
@ -119,6 +121,12 @@ pub trait ImprovDataToPacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait ImprovDataFromPacket: ImprovDataPacketType + Sized {
|
||||||
|
type Error;
|
||||||
|
|
||||||
|
fn try_from_packet(improv_packet: &ImprovPacket) -> Result<Self, Self::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ImprovPacket {
|
pub struct ImprovPacket {
|
||||||
pub version: u8,
|
pub version: u8,
|
||||||
pub r#type: PacketType,
|
pub r#type: PacketType,
|
||||||
@ -179,12 +187,44 @@ impl ImprovPacket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct CurrentStateResponse {
|
||||||
|
pub current_state: CurrentState,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ImprovDataPacketType for CurrentStateResponse {
|
||||||
|
const packet_type: PacketType = PacketType::CurrentState;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ImprovDataToPacket for CurrentStateResponse {
|
||||||
|
fn to_bytes(self: &Self) -> Vec<u8> {
|
||||||
|
let mut out = Vec::new();
|
||||||
|
out.push(self.current_state.clone() as u8);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ImprovDataFromPacket for CurrentStateResponse {
|
||||||
|
type Error = &'static str;
|
||||||
|
|
||||||
|
fn try_from_packet(improv_packet: &ImprovPacket) -> Result<Self, Self::Error>{
|
||||||
|
if improv_packet.r#type != Self::packet_type {
|
||||||
|
return Err("Packet is not CurrentStateResponse");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(Self {
|
||||||
|
current_state: CurrentState::try_from(&improv_packet.data[0])?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct RequestCurrentStateCommand {
|
pub struct RequestCurrentStateCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ImprovDataToPacket for RequestCurrentStateCommand {
|
impl ImprovDataPacketType for RequestCurrentStateCommand {
|
||||||
const packet_type: PacketType = PacketType::RPCCommand;
|
const packet_type: PacketType = PacketType::RPCCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ImprovDataToPacket for RequestCurrentStateCommand {
|
||||||
fn to_bytes(self: &Self) -> Vec<u8> {
|
fn to_bytes(self: &Self) -> Vec<u8> {
|
||||||
let mut out = Vec::new();
|
let mut out = Vec::new();
|
||||||
out.push(RPCCommand::RequestCurrentState as u8);
|
out.push(RPCCommand::RequestCurrentState as u8);
|
||||||
|
@ -16,7 +16,9 @@ use improv_setup::improv::{
|
|||||||
CurrentState,
|
CurrentState,
|
||||||
calculate_checksum,
|
calculate_checksum,
|
||||||
ImprovDataToPacket,
|
ImprovDataToPacket,
|
||||||
|
ImprovDataFromPacket,
|
||||||
ImprovPacket,
|
ImprovPacket,
|
||||||
|
CurrentStateResponse,
|
||||||
RequestCurrentStateCommand,
|
RequestCurrentStateCommand,
|
||||||
};
|
};
|
||||||
use log::{
|
use log::{
|
||||||
@ -148,8 +150,9 @@ async fn main() -> Result<()>{
|
|||||||
println!("Type: {}", &improv_packet.r#type);
|
println!("Type: {}", &improv_packet.r#type);
|
||||||
|
|
||||||
if improv_packet.r#type == PacketType::CurrentState {
|
if improv_packet.r#type == PacketType::CurrentState {
|
||||||
let current_state = CurrentState::try_from(&improv_packet.data[0]).unwrap();
|
let current_state_response = CurrentStateResponse::try_from_packet(&improv_packet).unwrap();
|
||||||
println!("Current state: {}", ¤t_state);
|
|
||||||
|
println!("Current state: {}", ¤t_state_response.current_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user