1use std::ops::Range;
2
3use crate::HackRf;
4
5#[derive(Debug, thiserror::Error)]
6pub enum Error {
7 #[error("I/O error")]
8 Io(#[from] std::io::Error),
9 #[error("USB transfer error")]
10 Transfer(#[from] nusb::transfer::TransferError),
11 #[error("Address (0x{addr:x}) out of range (0x{}..0x{})", .range.start, .range.end)]
12 AddressRange { range: Range<u32>, addr: u32 },
13 #[error("Value (0x{val:x}) out of range (0x{}..0x{})", .range.start, .range.end)]
14 ValueRange { range: Range<u32>, val: u32 },
15 #[error("Tuning Value ({val:x} Hz) out of range ({}..{} Hz)", .range.start, .range.end)]
16 TuningRange { range: Range<u64>, val: u64 },
17 #[error("Invalid return data")]
18 ReturnData,
19 #[error("Requires API >= 0x{:x}, but device has API 0x{:x}", needed, actual)]
20 ApiVersion { needed: u16, actual: u16 },
21 #[error("Invalid Parameter: {0}")]
22 InvalidParameter(&'static str),
23 #[error("USB transfer pipe is full of pending transfers")]
24 TransferBusy,
25}
26
27pub struct StateChangeError {
32 pub err: Error,
34 pub rf: HackRf,
36}
37
38impl core::error::Error for StateChangeError {
39 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
40 Some(&self.err)
41 }
42}
43
44impl core::fmt::Display for StateChangeError {
45 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46 f.write_str("Failed to change state")
47 }
48}
49
50impl core::fmt::Debug for StateChangeError {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 f.debug_struct("StateChangeError")
53 .field("err", &self.err)
54 .finish_non_exhaustive()
55 }
56}