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