oca 0.2.0

An experiment with no_std
Documentation
use oca::{
    ocp1::{
        encoder, parser,
        pdu::{
            Command, Handle, Header, KeepAlive, MessageCount, MessagePdu, Notification1,
            Notification1EventData, Notification1Parameters, Notification2,
            Notification2ExceptionData, Notification2ExceptionType, Notification2Type, Parameters,
            PduSize, PduType, ProtocolVersion, Response,
        },
    },
    types::{OcaEvent, OcaMethod, OcaMethodId, OcaONo, OcaStatus},
};

#[test]
fn encodes_a_message_that_the_parser_reads_back() {
    let message = MessagePdu {
        header: Header {
            protocol_version: ProtocolVersion::V1,
            pdu_size: PduSize::from((Header::SIZE + 5) as u32),
            pdu_type: PduType::Command,
            message_count: MessageCount::try_from(1).unwrap(),
        },
        data: b"hello",
    };

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_pdu(&message, &mut buffer).unwrap();
    let (parsed, leftover) = parser::message_pdu(encoded).unwrap();

    assert_eq!(message, parsed);
    assert!(leftover.is_empty());
}

#[test]
fn encodes_a_command_that_the_parser_reads_back() {
    let command = Command {
        handle: Handle::from(42),
        method: OcaMethod {
            object: OcaONo::from(7),
            id: OcaMethodId { level: 2, index: 3 },
        },
        parameters: Parameters {
            count: 3,
            parameters: b"abc",
        },
    };

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&command, &mut buffer).unwrap();

    let (parsed, leftover) = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::command(pdu.data))
        .unwrap();

    assert_eq!(command, parsed);
    assert!(leftover.is_empty());
}

#[test]
fn encodes_a_response_that_the_parser_reads_back() {
    let response = Response {
        handle: Handle::from(42),
        status: OcaStatus::Err(5),
        parameters: Parameters {
            count: 3,
            parameters: b"abc",
        },
    };

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&response, &mut buffer).unwrap();
    let (parsed, leftover) = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::response(pdu.data))
        .unwrap();

    assert_eq!(response, parsed);
    assert!(leftover.is_empty());
}

#[test]
fn encodes_a_notification1_that_the_parser_reads_back() {
    let notification = Notification1 {
        target: OcaMethod {
            object: 100.into(),
            id: (1, 3).into(),
        },
        parameters: Notification1Parameters {
            context: b"foo",
            event_data: Notification1EventData {
                event: OcaEvent {
                    object: 100.into(),
                    id: (1, 1).into(),
                },
                parameters: Parameters {
                    count: 2,
                    parameters: b"helloworld",
                },
            },
        },
    };

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&notification, &mut buffer).unwrap();
    let (parsed, leftover) = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::notification1(pdu.data))
        .unwrap();

    assert_eq!(notification, parsed);
    assert!(leftover.is_empty());
}

#[test]
fn encodes_a_notification2_event_that_the_parser_reads_back() {
    let notification = Notification2 {
        event: OcaEvent {
            object: 100.into(),
            id: (1, 1).into(),
        },
        r#type: Notification2Type::Event(b"some-cool-event"),
    };

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&notification, &mut buffer).unwrap();
    let (parsed, leftover) = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::notification2(pdu.data))
        .unwrap();

    assert_eq!(notification, parsed);
    assert!(leftover.is_empty());
}

#[test]
fn encodes_a_notification2_exception_that_the_parser_reads_back() {
    let notification = Notification2 {
        event: OcaEvent {
            object: 100.into(),
            id: (1, 1).into(),
        },
        r#type: Notification2Type::Exception(Notification2ExceptionData {
            r#type: Notification2ExceptionType::Unspecified,
            try_again: false,
            data: b"whoops!",
        }),
    };

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&notification, &mut buffer).unwrap();
    let (parsed, leftover) = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::notification2(pdu.data))
        .unwrap();

    assert_eq!(notification, parsed);
    assert!(leftover.is_empty());
}

#[test]
fn encodes_keep_alive_seconds_that_the_parser_reads_back() {
    let keep_alive = KeepAlive::Seconds(30);

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&keep_alive, &mut buffer).unwrap();
    let parsed = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::keep_alive(pdu.data))
        .unwrap();

    assert_eq!(keep_alive, parsed);
}

#[test]
fn encodes_keep_alive_milliseconds_that_the_parser_reads_back() {
    let keep_alive = KeepAlive::Milliseconds(1500);

    let mut buffer = [0u8; 64];
    let encoded = encoder::encode_message(&keep_alive, &mut buffer).unwrap();
    let parsed = parser::message_pdu(encoded)
        .and_then(|(pdu, _)| parser::keep_alive(pdu.data))
        .unwrap();

    assert_eq!(keep_alive, parsed);
}