pub mod app;
pub mod category;
pub mod command;
pub mod event;
pub mod notification;
use nom::{
multi::count,
number::complete::{le_u16, le_u8},
IResult,
};
use std::fmt::Debug;
use self::{notification::NotificationAttributeID, app::AppAttributeID};
#[derive(Debug, PartialEq, Clone)]
pub struct NotificationAttribute {
pub id: NotificationAttributeID,
pub length: u16,
pub value: Option<String>
}
impl From<NotificationAttribute> for Vec<u8> {
fn from(original: NotificationAttribute) -> Vec<u8> {
let mut vec: Vec<u8> = Vec::new();
let id: u8 = original.id.into();
let length: [u8; 2] = original.length.to_le_bytes();
let attribute: Option<Vec<u8>> = match original.value {
Some(value) => { Some(value.into_bytes()) },
None => None,
};
vec.push(id);
vec.extend(length.to_vec());
match attribute {
Some(attribute) => { vec.extend(attribute)},
None => (),
};
return vec;
}
}
impl NotificationAttribute {
pub fn parse(i: &[u8]) -> IResult<&[u8], NotificationAttribute> {
let (i, id) = notification::NotificationAttributeID::parse(i)?;
let (i, length) = le_u16(i)?;
let (i, attribute) = count(le_u8, length.into())(i)?;
Ok((
i,
NotificationAttribute {
id: notification::NotificationAttributeID::try_from(id).unwrap(),
length: length,
value: Some(String::from_utf8(attribute).unwrap()),
},
))
}
}
#[derive(Debug, PartialEq, Clone)]
pub struct AppAttribute {
pub id: AppAttributeID,
pub length: u16,
pub value: Option<String>
}
impl From<AppAttribute> for Vec<u8> {
fn from(original: AppAttribute) -> Vec<u8> {
let mut vec: Vec<u8> = Vec::new();
let id: u8 = original.id.into();
let length: [u8; 2] = original.length.to_le_bytes();
let attribute: Option<Vec<u8>> = match original.value {
Some(value) => { Some(value.into_bytes()) },
None => None,
};
vec.push(id);
vec.extend(length.to_vec());
match attribute {
Some(attribute) => { vec.extend(attribute)},
None => (),
};
return vec;
}
}
impl AppAttribute {
pub fn parse(i: &[u8]) -> IResult<&[u8], AppAttribute> {
let (i, id) = app::AppAttributeID::parse(i)?;
let (i, length) = le_u16(i)?;
let (i, attribute) = count(le_u8, length.into())(i)?;
Ok((
i,
AppAttribute {
id: app::AppAttributeID::try_from(id).unwrap(),
length: length,
value: Some(String::from_utf8(attribute).unwrap()),
},
))
}
}