esphome-native-api 2.0.7

Rust implementation of the ESPHome native API for communication with ESPHome devices, supporting both encrypted and plaintext connections.
Documentation
use log::debug;

use crate::parser;
pub use parser::ProtoMessage;

pub(crate) fn packet_to_message(buffer: &[u8]) -> Result<ProtoMessage, Box<dyn std::error::Error>> {
    let message_type = buffer[0] as usize;
    let packet_content = &buffer[1..];
    debug!("Message type: {}", message_type);
    debug!("Message: {:02X?}", packet_content);
    Ok(parser::parse_proto_message(message_type, packet_content).unwrap())
}


pub(crate) fn message_to_packet(message: &ProtoMessage) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
    let response_content = parser::proto_to_vec(message)?;
    let message_type = parser::message_to_num(message)?;
    let message_bit: Vec<u8> = vec![message_type];

    Ok([message_bit, response_content].concat())
}

#[cfg(test)]
mod tests {
    use test_log::test;

    use crate::proto::HelloRequest;

    use super::*;

    #[test]
    fn hello_message_short_parse() {
        let bytes: Vec<u8> = vec![
            0x01, 0x0a, 0x0d, 0x61, 0x69, 0x6f, 0x65, 0x73, 0x70, 0x68, 0x6f, 0x6d, 0x65, 0x61,
            0x70, 0x69, 0x10, 0x01, 0x18, 0x0a,
        ];

        let message = packet_to_message(&bytes).unwrap();
        match message {
            ProtoMessage::HelloRequest(msg) => {
                assert_eq!(msg.api_version_major, 1);
                assert_eq!(msg.api_version_minor, 10);
                assert_eq!(msg.client_info, "aioesphomeapi");
            }
            _ => panic!("Expected HelloRequest message"),
        }
    }

    #[test]
    fn hello_message_short_serialize() {
        let message = ProtoMessage::HelloRequest(HelloRequest {
            api_version_major: 1,
            api_version_minor: 10,
            client_info: "aioesphomeapi".to_string(),
        });
        let bytes = message_to_packet(&message).unwrap();

        assert_eq!(
            bytes,
            vec![
                1, 10, 13, 97, 105, 111, 101, 115, 112, 104, 111, 109, 101, 97, 112, 105, 16, 1,
                24, 10
            ]
        );
    }
}