domo/domo_proto/src/lib.rs

77 lines
2.1 KiB
Rust

//! Welcome to the Domo protocol rust implementation.
//!
//! This implementation is up-to-date with DomoProto v1.
//!
//! Most code that should/is actually used (usually) has documentation with it.
#![forbid(clippy::unwrap_used, clippy::expect_used)]
#[macro_use]
#[doc(hidden)]
pub mod prelude;
/// Domo protocol packet abstraction.
pub mod packet;
/// Identifier helper code.
pub mod identifier;
/// Data Types as stated in the Domo protocol spec.
pub mod data_types;
/// Commands are according to Domo protocol spec.
pub mod commands;
#[cfg(test)]
mod tests {
use crate::packet;
use crate::data_types::{DataType, get_data_types};
use crate::identifier::Identifier;
use crate::packet::Packet;
use crate::packet::packet_data::PacketData;
#[test]
pub fn data_types() {
// test Vec<u8> -> Vec<DataType>
assert_eq!(
get_data_types(vec![0x00, 0x10, 0x00]),
vec![
DataType::Nothing,
DataType::Switch(false),
]);
// test DataType -> Vec<u8>
assert_eq!(
Into::<Vec<u8>>::into(DataType::Switch(true)),
vec![0x10, 0x01]
)
}
#[test]
pub fn packets() {
assert_eq!(
Into::<Vec<u8>>::into(packet::Packet {
src: Identifier::from(0xAABBCCDD),
dest: Identifier::from(0xAABBCCDD),
packet_id: Identifier::from(0x00000001),
reply_to: Identifier::from(0x00000000),
command: 0x00,
data: PacketData::default(),
}),
{
let mut v: Vec<u8> = vec![
0x01, // version
0xAA, 0xBB, 0xCC, 0xDD, // dest
0xAA, 0xBB, 0xCC, 0xDD, // src
0x00, 0x00, 0x00, 0x01, // packet_id
0x00, 0x00, 0x00, 0x00, // reply_to
0x00, // command
0x00, 0x00, // data length
// no packet data
];
v.extend(crc32fast::hash(&v).to_be_bytes().to_vec());
v
}
);
}
}