parlov-elicit 0.5.0

Elicitation engine: strategy selection and probe plan generation for parlov.
Documentation
//! Cache-probing existence strategies.
//!
//! Each module implements one strategy that uses conditional, range, or
//! content-negotiation headers to detect existence through RFC-mandated
//! response differentials.

use std::sync::Arc;

use crate::chain::ChainRegistry;

pub mod accept;
pub mod if_match;
pub mod if_modified_since;
pub mod if_none_match;
pub mod if_range;
pub mod if_unmodified_since;
pub mod range_satisfiable;
pub mod range_unsatisfiable;

pub use accept::CpAccept;
pub use if_match::CpIfMatch;
pub use if_modified_since::CpIfModifiedSince;
pub use if_none_match::CpIfNoneMatch;
pub use if_range::CpIfRange;
pub use if_unmodified_since::CpIfUnmodifiedSince;
pub use range_satisfiable::CpRangeSatisfiable;
pub use range_unsatisfiable::CpRangeUnsatisfiable;

/// Builds a `ChainRegistry` pre-wired with all cache-probing producer/consumer pairs.
///
/// Returns a fresh registry on every call. Cache the result in the caller when
/// running multiple scans to avoid re-allocation.
#[must_use]
pub fn cp_chain_registry() -> ChainRegistry {
    let mut reg = ChainRegistry::new();
    reg.register(
        Arc::new(if_match::CpIfMatchProducer),
        Arc::new(if_match::CpIfMatchConsumer),
    );
    reg.register(
        Arc::new(if_none_match::CpIfNoneMatchProducer),
        Arc::new(if_none_match::CpIfNoneMatchConsumer),
    );
    reg.register(
        Arc::new(if_range::CpIfRangeProducer),
        Arc::new(if_range::CpIfRangeConsumer),
    );
    reg.register(
        Arc::new(if_modified_since::CpIfModifiedSinceProducer),
        Arc::new(if_modified_since::CpIfModifiedSinceConsumer),
    );
    reg.register(
        Arc::new(if_unmodified_since::CpIfUnmodifiedSinceProducer),
        Arc::new(if_unmodified_since::CpIfUnmodifiedSinceConsumer),
    );
    reg.register(
        Arc::new(range_satisfiable::CpRangeSizeProducer),
        Arc::new(range_satisfiable::CpRangeSatisfiableConsumer),
    );
    reg.register(
        Arc::new(range_satisfiable::CpRangeSizeProducer),
        Arc::new(range_unsatisfiable::CpRangeUnsatisfiableConsumer),
    );
    reg
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn cp_chain_registry_has_seven_edges() {
        assert_eq!(cp_chain_registry().len(), 7);
    }
}