#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std as alloc;
mod verb;
mod frame;
mod payload;
mod address;
mod error;
mod auth;
pub use verb::Verb;
pub use frame::{Frame, FrameBuilder};
pub use payload::{Payload, PayloadEncoder, PayloadDecoder};
pub use address::{Address, AddressString, HostCache};
pub use error::{ProtocolError, ProtocolResult};
pub use auth::{AuthLevel, AuthBlock, SecurityContext, SessionId, Signature};
pub use auth::{is_protected_path, path_auth_level, PROTECTED_PATHS};
pub const VERSION: u8 = 1;
pub const END: u8 = 0x00;
pub const ESC: u8 = 0x1B;
pub const MAX_PAYLOAD_LEN: usize = 65535;
pub const MAX_FRAME_SIZE: usize = MAX_PAYLOAD_LEN + 4;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ping_frame() {
let frame = Frame::new(Verb::Ping, Payload::empty());
let encoded = frame.encode();
assert_eq!(encoded, vec![0x05, 0x00]);
}
#[test]
fn test_scan_frame() {
let mut payload = Payload::new();
payload.push_str("/home/hue");
payload.push_byte(3);
let frame = Frame::new(Verb::Scan, payload);
let encoded = frame.encode();
assert_eq!(encoded[0], 0x01); assert_eq!(encoded[encoded.len() - 1], 0x00); }
#[test]
fn test_escape_sequence() {
let mut payload = Payload::new();
payload.push_byte(0x00); payload.push_byte(0x1B); payload.push_byte(0x42);
let encoded = payload.encode();
assert_eq!(encoded, vec![0x1B, 0x00, 0x1B, 0x1B, 0x42]);
}
#[test]
fn test_roundtrip() {
let original = Frame::new(Verb::Search, Payload::from_string("*.rs"));
let encoded = original.encode();
let decoded = Frame::decode(&encoded).unwrap();
assert_eq!(decoded.verb(), original.verb());
assert_eq!(decoded.payload().as_bytes(), original.payload().as_bytes());
}
}