o3 0.9.2

shared-nothing primitives
Documentation
use o3::buffer::{ByteRing, ByteSink, Owned, SliceWriter};

fn write_pair<W: ByteSink>(out: &mut W, first: &[u8], second: &[u8]) -> Result<(), W::Error> {
    out.write_slices([first, second])
}

#[test]
fn one_generic_sink_covers_growing_exact_and_slice_outputs() {
    let mut growing = Vec::new();
    write_pair(&mut growing, b"one", b"two").unwrap();
    assert_eq!(growing, b"onetwo");

    let mut owned = Owned::try_with_capacity(6).unwrap();
    {
        let mut writer = owned.spare_writer();
        write_pair(&mut writer, b"one", b"two").unwrap();
    }
    assert_eq!(owned.as_slice(), b"onetwo");

    let mut bytes = [0; 6];
    let mut writer = SliceWriter::new(&mut bytes);
    write_pair(&mut writer, b"one", b"two").unwrap();
    assert_eq!(writer.finish(), 6);
    assert_eq!(&bytes, b"onetwo");
}

#[test]
fn aggregate_slice_failure_does_not_commit_a_prefix() {
    let mut owned = Owned::try_with_capacity(5).unwrap();
    {
        let mut writer = owned.spare_writer();
        let error = writer
            .write_slices([b"abc".as_slice(), b"def".as_slice()])
            .unwrap_err();
        assert_eq!(error.attempted(), 6);
        assert_eq!(writer.len(), 0);
    }
    assert!(owned.is_empty());

    let mut bytes = [0; 5];
    let mut writer = SliceWriter::new(&mut bytes);
    assert!(write_pair(&mut writer, b"abc", b"def").is_err());
    assert_eq!(writer.len(), 0);
    assert_eq!(bytes, [0; 5]);
}

#[test]
fn aggregate_ring_write_wraps_atomically() {
    let mut ring = ByteRing::try_with_capacity(8).unwrap();
    ring.try_extend_from_slice(b"abcdef").unwrap();
    ring.try_consume(5).unwrap();

    write_pair(&mut ring, b"ghi", b"jkl").unwrap();
    assert_eq!(ring.as_slices(), (&b"fgh"[..], &b"ijkl"[..]));

    let before = {
        let (first, second) = ring.as_slices();
        [first, second].concat()
    };
    assert!(write_pair(&mut ring, b"m", b"n").is_err());
    let (first, second) = ring.as_slices();
    assert_eq!([first, second].concat(), before);
}