net-wire 0.1.0

Allocation-free no_std wire views and codecs for network protocols.
Documentation
use std::error::Error;

use net_wire::kcp::{
    KcpCommand, KcpConversationId, KcpFragment, KcpSegmentBuildError, KcpSegmentBuilder,
    KcpSequenceNumber, KcpTimestamp, KcpUnacknowledged,
};

use super::fixtures::SEGMENT;

#[test]
fn builder_uses_defaults_canonical_bytes_and_atomic_failures() {
    let mut defaults = [0; 24];
    let built = KcpSegmentBuilder::new(
        &mut defaults,
        KcpConversationId::new(7),
        KcpCommand::ACK,
        &[],
    )
    .build()
    .unwrap();
    assert_eq!(
        built.as_bytes(),
        [
            7, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ]
    );

    let mut destination = [0xa5; 29];
    {
        let built = KcpSegmentBuilder::new(
            &mut destination,
            KcpConversationId::new(0x1122_3344),
            KcpCommand::PUSH,
            &[0xde, 0xad, 0xbe],
        )
        .fragment(KcpFragment::new(2))
        .window_size(0x5566)
        .timestamp(KcpTimestamp::new(0x7788_99aa))
        .sequence_number(KcpSequenceNumber::new(0xbbcc_ddee))
        .unacknowledged(KcpUnacknowledged::new(0x0123_4567))
        .build()
        .unwrap();
        assert_eq!(built.as_bytes(), SEGMENT);
    }
    assert_eq!(&destination[27..], [0xa5, 0xa5]);

    let mut too_short = [0xa5; 26];
    let before = too_short;
    assert_eq!(
        KcpSegmentBuilder::new(
            &mut too_short,
            KcpConversationId::new(1),
            KcpCommand::PUSH,
            &[0xde, 0xad, 0xbe]
        )
        .build(),
        Err(KcpSegmentBuildError::BufferTooShort {
            required: 27,
            available: 26
        })
    );
    assert_eq!(too_short, before);
    assert!(
        Error::source(&KcpSegmentBuildError::BufferTooShort {
            required: 27,
            available: 26
        })
        .is_none()
    );
}