use hidpp::channel::{ChannelObservation, ObservedReport, RequestOutcome};
use openlogi_device::backend::NodeInfo;
use thiserror::Error;
pub const MAX_RECORDED_RAW_REPORT_LENGTH: usize = 64;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RecordingSequence(pub(super) u64);
impl RecordingSequence {
#[must_use]
pub const fn get(self) -> u64 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RecordedChannelId(pub(super) u64);
impl RecordedChannelId {
#[must_use]
pub const fn get(self) -> u64 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct RecordedRawWriterId(pub(super) u64);
impl RecordedRawWriterId {
#[must_use]
pub const fn get(self) -> u64 {
self.0
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RecordedChannelOpenOutcome {
Opened {
supports_short: bool,
supports_long: bool,
},
NotHidpp,
Failed(String),
Cancelled,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RecordedRequestFact {
OutgoingReport {
sequence: RecordingSequence,
report: ObservedReport,
},
IncomingReport {
sequence: RecordingSequence,
report: ObservedReport,
},
Outcome {
sequence: RecordingSequence,
outcome: RequestOutcome,
},
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RecordedRequest {
pub request_id: u64,
pub facts: Vec<RecordedRequestFact>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RecordedChannelEvidence {
pub sequence: RecordingSequence,
pub observation: ChannelObservation,
}
#[derive(Debug)]
pub struct RecordedChannel {
pub id: RecordedChannelId,
pub node: NodeInfo,
pub started_at: RecordingSequence,
pub open_outcome: RecordedChannelOpenOutcome,
pub open_outcome_at: RecordingSequence,
pub requests: Vec<RecordedRequest>,
pub unassociated: Vec<RecordedChannelEvidence>,
pub closed_at: Option<RecordingSequence>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RecordedRawWriteOutcome {
Succeeded,
Failed(String),
Cancelled,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RecordedRawWrite {
pub sequence: RecordingSequence,
pub report: Box<[u8]>,
pub outcome: RecordedRawWriteOutcome,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RecordedRawWriterOpenOutcome {
Opened,
Failed(String),
Cancelled,
}
#[derive(Debug)]
pub struct RecordedRawWriter {
pub id: RecordedRawWriterId,
pub node: NodeInfo,
pub started_at: RecordingSequence,
pub open_outcome: RecordedRawWriterOpenOutcome,
pub open_outcome_at: RecordingSequence,
pub writes: Vec<RecordedRawWrite>,
pub closed_at: Option<RecordingSequence>,
}
#[derive(Debug, Default)]
pub struct NativeRecording {
pub channels: Vec<RecordedChannel>,
pub raw_writers: Vec<RecordedRawWriter>,
}
#[derive(Clone, Debug, Error, PartialEq, Eq)]
pub enum NativeRecordingError {
#[error("native recorder capacity must be at least one event")]
InvalidCapacity,
#[error("could not start native recorder worker: {0}")]
WorkerStart(String),
#[error("native recorder overflowed its {capacity}-event capacity")]
Overflow {
capacity: usize,
},
#[error("raw report length {length} exceeds recording limit {max}")]
RawReportTooLong {
length: usize,
max: usize,
},
#[error("native recorder finalized with {count} active producer(s)")]
ActiveProducers {
count: usize,
},
#[error("native recorder is closed")]
Closed,
#[error("native recorder worker stopped unexpectedly")]
WorkerUnavailable,
#[error("native recorder worker panicked")]
WorkerPanicked,
#[error("native recorder was already finalized")]
AlreadyFinalized,
}