use polyc_proto::proto::polychrome::events::v1::{
SummaryEvent, SummaryGateAdmittedEvent, SummaryGateRejectedEvent,
};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct SummaryFact {
pub text: String,
pub covers_through_position: u64,
}
impl From<SummaryEvent> for SummaryFact {
fn from(event: SummaryEvent) -> Self {
Self {
text: event.text,
covers_through_position: event.covers_through_position,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct SummaryGateFact {
pub dropped_identifiers: Vec<String>,
pub count: u32,
}
pub fn fold_summary_event(payload: &[u8]) -> Result<SummaryFact, buffa::DecodeError> {
polyc_proto::events_decode::try_decode_event_payload::<SummaryEvent>(payload)
.map(SummaryFact::from)
}
pub fn fold_summary_gate_rejected_event(
payload: &[u8],
) -> Result<SummaryGateFact, buffa::DecodeError> {
polyc_proto::events_decode::try_decode_event_payload::<SummaryGateRejectedEvent>(payload).map(
|event| SummaryGateFact {
dropped_identifiers: event.dropped_identifiers,
count: event.dropped_count,
},
)
}
pub fn fold_summary_gate_admitted_event(
payload: &[u8],
) -> Result<SummaryGateFact, buffa::DecodeError> {
polyc_proto::events_decode::try_decode_event_payload::<SummaryGateAdmittedEvent>(payload).map(
|event| SummaryGateFact {
dropped_identifiers: event.dropped_identifiers,
count: event.reject_count,
},
)
}
#[cfg(test)]
mod tests {
#![allow(clippy::pedantic, clippy::nursery, missing_docs, clippy::unwrap_used)]
use super::*;
use buffa::Message as _;
#[test]
fn a_summary_payload_decodes_to_its_text_and_coverage() {
let payload = SummaryEvent {
text: "the conversation so far".to_owned(),
covers_through_position: 42,
..Default::default()
}
.encode_to_vec();
assert_eq!(
fold_summary_event(&payload).unwrap(),
SummaryFact {
text: "the conversation so far".to_owned(),
covers_through_position: 42,
}
);
}
#[test]
fn an_empty_payload_decodes_to_an_empty_fact() {
assert_eq!(fold_summary_event(&[]).unwrap(), SummaryFact::default());
assert_eq!(
fold_summary_gate_rejected_event(&[]).unwrap(),
SummaryGateFact::default()
);
}
#[test]
fn a_malformed_payload_returns_its_error() {
let corrupt = [0xffu8, 0xff, 0xff, 0xff];
assert!(fold_summary_event(&corrupt).is_err());
assert!(fold_summary_gate_rejected_event(&corrupt).is_err());
assert!(fold_summary_gate_admitted_event(&corrupt).is_err());
}
#[test]
fn each_gate_kind_reads_the_count_its_own_payload_carries() {
let rejected = SummaryGateRejectedEvent {
dropped_identifiers: vec!["invoice-7".to_owned()],
dropped_count: 3,
..Default::default()
}
.encode_to_vec();
assert_eq!(
fold_summary_gate_rejected_event(&rejected).unwrap(),
SummaryGateFact {
dropped_identifiers: vec!["invoice-7".to_owned()],
count: 3,
}
);
let admitted = SummaryGateAdmittedEvent {
dropped_identifiers: vec!["invoice-7".to_owned()],
reject_count: 5,
..Default::default()
}
.encode_to_vec();
assert_eq!(
fold_summary_gate_admitted_event(&admitted).unwrap(),
SummaryGateFact {
dropped_identifiers: vec!["invoice-7".to_owned()],
count: 5,
}
);
}
}