add basic error handling
This commit is contained in:
parent
1156fa865d
commit
b663cef8f0
10
src/main.rs
10
src/main.rs
@ -60,6 +60,12 @@ pub async fn apiserver() -> io::Result<()> {
|
|||||||
|
|
||||||
pub fn handle(buf: &Vec<u8>) {
|
pub fn handle(buf: &Vec<u8>) {
|
||||||
let mut rawdata = buf.to_vec();
|
let mut rawdata = buf.to_vec();
|
||||||
let msg = parse_inbound_msg(&mut rawdata);
|
match parse_inbound_msg(&mut rawdata) {
|
||||||
println!("{}", msg);
|
Ok(o) => {
|
||||||
|
println!("msg: {}", o);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("parse inbound message error: {}", e);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
27
src/parser/error.rs
Normal file
27
src/parser/error.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
pub struct MessageError;
|
||||||
|
|
||||||
|
impl std::fmt::Debug for MessageError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
write!(f, "invalid protocol")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for MessageError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
write!(f, "invalid protocol")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct NotOurProtocolError;
|
||||||
|
|
||||||
|
impl std::fmt::Debug for NotOurProtocolError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
write!(f, "invalid protocol")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for NotOurProtocolError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
write!(f, "invalid protocol")
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,8 @@
|
|||||||
mod body;
|
mod body;
|
||||||
|
mod error;
|
||||||
|
|
||||||
use body::*;
|
use body::*;
|
||||||
use std::fmt::*;
|
use error::*;
|
||||||
|
|
||||||
use bcd_convert::BcdNumber;
|
use bcd_convert::BcdNumber;
|
||||||
|
|
||||||
@ -16,13 +17,20 @@ const PROPS_RESERVED_MASK: u16 = 0xC000;
|
|||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
const PROPS_DATAENCRYPTION_MASK: u16 = 0x0E00;
|
const PROPS_DATAENCRYPTION_MASK: u16 = 0x0E00;
|
||||||
|
|
||||||
pub fn parse_inbound_msg(rawdata: &mut Vec<u8>) -> Message {
|
pub fn parse_inbound_msg(rawdata: &mut Vec<u8>) -> std::result::Result<Message, MessageError> {
|
||||||
let mut msg: Message = Message::default();
|
let mut msg: Message = Message::default();
|
||||||
|
|
||||||
msg.parse_header(rawdata);
|
match msg.parse_header(rawdata) {
|
||||||
msg.check(rawdata);
|
Ok(_) => {
|
||||||
|
msg.check(rawdata);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
println!("error parsing header {e}");
|
||||||
|
return Err(MessageError);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
msg
|
Ok(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
@ -45,11 +53,14 @@ impl std::fmt::Display for Message {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Message {
|
impl Message {
|
||||||
pub fn parse_header(&mut self, rawdata: &mut Vec<u8>) {
|
pub fn parse_header(
|
||||||
|
&mut self,
|
||||||
|
rawdata: &mut Vec<u8>,
|
||||||
|
) -> std::result::Result<(), NotOurProtocolError> {
|
||||||
let mut data = rawdata.clone().into_iter();
|
let mut data = rawdata.clone().into_iter();
|
||||||
let first_byte = data.next().unwrap();
|
let first_byte = data.next().unwrap();
|
||||||
if first_byte == FLAGDELIMITER {
|
if first_byte != FLAGDELIMITER {
|
||||||
println!("first flag ok");
|
return Err(NotOurProtocolError);
|
||||||
};
|
};
|
||||||
let mut tmpid = vec![];
|
let mut tmpid = vec![];
|
||||||
tmpid.push(data.next().unwrap());
|
tmpid.push(data.next().unwrap());
|
||||||
@ -74,12 +85,11 @@ impl Message {
|
|||||||
|
|
||||||
self.checksum = data.next().unwrap();
|
self.checksum = data.next().unwrap();
|
||||||
|
|
||||||
if data.next().unwrap() == FLAGDELIMITER {
|
if data.next().unwrap() != FLAGDELIMITER {
|
||||||
println!("end flag ok");
|
return Err(NotOurProtocolError);
|
||||||
} else {
|
|
||||||
println!("error with endflag");
|
|
||||||
}
|
}
|
||||||
self.parse_body();
|
self.parse_body();
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_properties(&mut self) {
|
pub fn parse_properties(&mut self) {
|
||||||
|
Loading…
Reference in New Issue
Block a user