openlogi_device/
replay.rs1mod backend;
8mod barrier;
9mod channel;
10mod fixture;
11mod slots;
12
13use openlogi_fixture::FixtureError;
14use thiserror::Error;
15
16pub use backend::{
17 ChannelConnection, NodePresence, OpenOutcome, RawWriterAvailability, ReceiverLinkState,
18 ReceiverSlot, ReceiverSlotState, ReplayBackend, ReplayChannel, ReplayNode, ReplayTopology,
19};
20pub use barrier::ReplayResponseBarrier;
21pub use channel::{
22 ReplayChannelHandle, ReplayCompletion, ReplayMismatch, ReplayRawHidChannel, ReplayRawWriter,
23 ReplayRawWriterHandle,
24};
25
26#[derive(Clone, Debug, Error, PartialEq, Eq)]
28pub enum ReplayError {
29 #[error(transparent)]
31 Fixture(#[from] FixtureError),
32 #[error("invalid {asset}: {message}")]
34 InvalidState {
35 asset: &'static str,
37 message: String,
39 },
40 #[error("unmatched HID request: actual={actual}, hidpp20_normalized={normalized}")]
42 UnmatchedRequest {
43 actual: String,
45 normalized: String,
47 },
48 #[error("required cassette exchanges were not consumed: {requests:?}")]
50 UnconsumedExchanges {
51 requests: Vec<String>,
53 },
54 #[error("unknown replay node {0}")]
56 UnknownNode(String),
57 #[error("unknown replay channel {0}")]
59 UnknownChannel(String),
60}
61
62impl ReplayError {
63 fn invalid(asset: &'static str, message: impl Into<String>) -> Self {
64 Self::InvalidState {
65 asset,
66 message: message.into(),
67 }
68 }
69}
70
71#[cfg(test)]
72mod session_replay_tests;
73#[cfg(test)]
74mod tests;