use super::conclude::agreement;
use super::types::{
FUSED_VERSUS_SEPARATE_DISAGREEMENT, LIVE_VERSUS_REPLAYED_DISAGREEMENT, ParityReading,
ParitySuite, RoadPairing,
};
use crate::report::FindingCause;
#[must_use]
#[track_caller]
pub fn parity<'suite, 'input, Input, Meaning>(
suite: &'suite ParitySuite<Input, Meaning>,
input: &'input Input,
) -> ParityReading<'suite, 'input, Input, Meaning> {
let left = (suite.left())(input);
let right = (suite.right())(input);
let conclusion = agreement(suite.same(), &left, &right, cited(suite.pairing()));
ParityReading::from_run(suite, input, left, right, conclusion)
}
fn cited(pairing: RoadPairing) -> FindingCause {
match pairing {
RoadPairing::FusedVersusSeparate => FUSED_VERSUS_SEPARATE_DISAGREEMENT,
RoadPairing::LiveVersusReplayed => LIVE_VERSUS_REPLAYED_DISAGREEMENT,
RoadPairing::Declared(name) => {
FindingCause::named(name.namespace().written(), name.stem().written())
}
}
}