sark-http 0.29.1

HTTP wire types, semantics, codecs, and ownership invariants for Sark
use sark_http::preface::{CLIENT_PREFACE, Prefix, Read};

#[test]
fn carries_only_the_admitted_prefix() {
    for split in 0..CLIENT_PREFACE.len() {
        let (count, Read::Pending(prefix)) = Prefix::default()
            .read(&CLIENT_PREFACE[..split])
            .expect("prefix")
        else {
            panic!("incomplete prefix");
        };
        assert_eq!(count, split);
        assert_eq!(prefix.as_ref(), &CLIENT_PREFACE[..split]);
        let mut suffix = CLIENT_PREFACE[split..].to_vec();
        suffix.push(0);
        let (count, Read::Complete(_)) = prefix.read(&suffix).expect("complete") else {
            panic!("complete preface");
        };
        assert_eq!(
            count,
            suffix.len() - 1,
            "next protocol input stays unconsumed"
        );
    }
}

#[test]
fn mismatch_retains_prior_input_and_exact_failure() {
    let (_, Read::Pending(prefix)) = Prefix::default().read(b"P").expect("prefix") else {
        panic!("partial preface");
    };
    let (prefix, offset, expected, actual) = prefix.read(b"RX").expect_err("mismatch").into_parts();
    assert_eq!(
        prefix.as_ref(),
        b"P",
        "the current input remains with its caller"
    );
    assert_eq!((offset, expected, actual), (2, b'I', b'X'));
}