sark-core 0.26.1

Fiber-free request, route, dispatch, and lifecycle core for Sark
Documentation
use std::ops::ControlFlow;
pub mod common;

use common::requests::{FIELDS, QUERIES, RAW};
use sark_core::route::field::query::{Entries, Error};

#[test]
fn tokens_keep_offsets() {
    for &(end, count) in QUERIES {
        let mut entries = Entries::try_new(RAW, 2..end).expect("query range");
        for [(name, range), (value, span)] in FIELDS.iter().take(count) {
            let field = entries.next().expect("query field");
            assert_eq!(field.name(), *name);
            assert_eq!(field.name_range(), *range);
            let actual = field.try_value().expect("value");
            assert_eq!(actual.as_ref(), *value);
            assert_eq!(actual.as_ref().as_ptr(), RAW[span.start..].as_ptr());
            let actual = field.try_span().expect("span");
            assert_eq!(actual.start()..actual.end(), *span);
        }
        assert!(entries.next().is_none());
    }
}

#[test]
fn fold_resumes() {
    let (end, count) = QUERIES[1];
    let mut entries = Entries::try_new(RAW, 2..end).expect("query range");
    let (seen, stopped) = entries
        .by_ref()
        .try_fold(0, |seen, entry| {
            if entry.name() == FIELDS[1][0].0 {
                ControlFlow::Break((seen, entry))
            } else {
                ControlFlow::Continue(seen + 1)
            }
        })
        .break_value()
        .expect("stop");
    assert_eq!(seen, 1);
    assert_eq!(stopped.name_range(), FIELDS[1][0].1);
    assert_eq!(
        entries.try_for_each(|entry| Err::<(), _>(entry.name_range())),
        Err(FIELDS[2][0].1.clone())
    );
    assert_eq!(
        entries.next().expect("resumed").name_range(),
        FIELDS[3][0].1
    );
    assert_eq!(
        stopped.name().as_ptr(),
        RAW[FIELDS[1][0].1.start..].as_ptr()
    );
    assert_eq!(
        entries.try_fold(0, |seen, _| Some(seen + 1)),
        Some(count - 4)
    );
    assert!(entries.next().is_none());
}

#[test]
fn range_errors_are_exact() {
    assert!(matches!(
        Entries::try_new(RAW, core::ops::Range { start: 2, end: 1 }),
        Err(Error::Order { start: 2, end: 1, capacity }) if capacity == RAW.len()
    ));
    assert!(matches!(
        Entries::try_new(RAW, 0..RAW.len() + 1),
        Err(Error::Bounds { start: 0, end, capacity })
            if end == RAW.len() + 1 && capacity == RAW.len()
    ));
}