net-wire 0.1.0

Allocation-free no_std wire views and codecs for network protocols.
Documentation
use net_wire::icmpv4::{Icmpv4MessageBuildError, Icmpv4MessageBuilder, Icmpv4Type};

#[test]
fn builder_is_exact_and_all_failures_are_atomic() {
    let mut output = [0xa5; 8];
    output[4..7].copy_from_slice(&[7, 8, 9]);
    let built = Icmpv4MessageBuilder::new(&mut output, 3)
        .message_type(Icmpv4Type::new(250))
        .code(17)
        .build()
        .unwrap();
    assert_eq!(built.as_bytes(), &[250, 17, 0xf5, 0xe5, 7, 8, 9]);
    assert_eq!(&output[7..], &[0xa5]);

    let mut buffer = [0xa5; 8];
    let before = buffer;
    assert_eq!(
        Icmpv4MessageBuilder::new(&mut buffer, 0).build(),
        Err(Icmpv4MessageBuildError::MissingType)
    );
    assert_eq!(buffer, before);
    assert_eq!(
        Icmpv4MessageBuilder::new(&mut buffer, 0)
            .message_type(Icmpv4Type::ECHO_REQUEST)
            .build(),
        Err(Icmpv4MessageBuildError::MissingCode)
    );
    assert_eq!(buffer, before);
    assert_eq!(
        Icmpv4MessageBuilder::new(&mut buffer, usize::MAX)
            .message_type(Icmpv4Type::ECHO_REQUEST)
            .code(0)
            .build(),
        Err(Icmpv4MessageBuildError::MessageLengthTooLarge)
    );
    assert_eq!(buffer, before);
    assert_eq!(
        Icmpv4MessageBuilder::new(&mut buffer, 5)
            .message_type(Icmpv4Type::ECHO_REQUEST)
            .code(0)
            .build(),
        Err(Icmpv4MessageBuildError::BufferTooShort {
            required: 9,
            available: 8
        })
    );
    assert_eq!(buffer, before);
}