| 1 | #[allow (clippy::module_name_repetitions)] |
| 2 | #[derive (Debug)] |
| 3 | #[non_exhaustive ] |
| 4 | /// An error type that can describe atspi and `std` and different `zbus` errors. |
| 5 | pub enum AtspiError { |
| 6 | /// Converting one type into another failure |
| 7 | Conversion(&'static str), |
| 8 | |
| 9 | /// When testing on either variant, we might find the we are not interested in. |
| 10 | CacheVariantMismatch, |
| 11 | |
| 12 | /// On specific types, if the event / message member does not match the Event's name. |
| 13 | MemberMatch(String), |
| 14 | |
| 15 | /// On specific types, if the event / message member does not match the Event's name. |
| 16 | InterfaceMatch(String), |
| 17 | |
| 18 | /// To indicate a match or equality test on a signal body signature failed. |
| 19 | UnknownBusSignature(String), |
| 20 | |
| 21 | /// When matching on an unknown interface |
| 22 | UnknownInterface, |
| 23 | |
| 24 | /// No interface on event. |
| 25 | MissingInterface, |
| 26 | |
| 27 | /// No member on event. |
| 28 | MissingMember, |
| 29 | |
| 30 | /// No Signature. |
| 31 | MissingSignature, |
| 32 | |
| 33 | /// When matching on an unknown role |
| 34 | UnknownRole(u32), |
| 35 | |
| 36 | /// No name on bus. |
| 37 | MissingName, |
| 38 | |
| 39 | /// The signal that was encountered is unknown. |
| 40 | UnknownSignal, |
| 41 | |
| 42 | /// Other errors. |
| 43 | Owned(String), |
| 44 | |
| 45 | /// A `zbus` or `zbus::Fdo` error. variant. |
| 46 | Zbus(String), |
| 47 | |
| 48 | /// A `zbus_names` error variant |
| 49 | ZBusNames(zbus_names::Error), |
| 50 | |
| 51 | /// A `zbus_names` error variant |
| 52 | Zvariant(zvariant::Error), |
| 53 | |
| 54 | /// Failed to parse a string into an enum variant |
| 55 | ParseError(&'static str), |
| 56 | |
| 57 | /// Failed to get the ID of a path. |
| 58 | PathConversionError(ObjectPathConversionError), |
| 59 | |
| 60 | /// Std i/o error variant. |
| 61 | IO(std::io::Error), |
| 62 | |
| 63 | /// Failed to convert an integer into another type of integer (usually i32 -> usize). |
| 64 | IntConversionError(std::num::TryFromIntError), |
| 65 | |
| 66 | /// An infallible error; this is just something to satisfy the compiler. |
| 67 | Infallible, |
| 68 | } |
| 69 | |
| 70 | impl std::error::Error for AtspiError {} |
| 71 | |
| 72 | impl std::fmt::Display for AtspiError { |
| 73 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| 74 | match self { |
| 75 | Self::Conversion(e) => f.write_str(&format!("atspi: conversion failure: {e}" )), |
| 76 | Self::MemberMatch(e) => { |
| 77 | f.write_str(format!("atspi: member mismatch in conversion: {e}" ).as_str()) |
| 78 | } |
| 79 | Self::InterfaceMatch(e) => { |
| 80 | f.write_str(format!("atspi: interface mismatch in conversion: {e}" ).as_str()) |
| 81 | } |
| 82 | Self::UnknownBusSignature(e) => { |
| 83 | f.write_str(format!("atspi: Unknown bus body signature: {e:?}" ).as_str()) |
| 84 | } |
| 85 | Self::UnknownInterface => f.write_str("Unknown interface." ), |
| 86 | Self::MissingInterface => f.write_str("Missing interface." ), |
| 87 | Self::MissingMember => f.write_str("Missing member." ), |
| 88 | Self::MissingSignature => f.write_str("Missing signature." ), |
| 89 | Self::UnknownRole(e) => f.write_str(&format!("atspi: Unknown role: {e}" )), |
| 90 | Self::UnknownSignal => f.write_str("atspi: Unknown signal" ), |
| 91 | Self::CacheVariantMismatch => f.write_str("atspi: Cache variant mismatch" ), |
| 92 | Self::Owned(e) => f.write_str(&format!("atspi: other error: {e}" )), |
| 93 | Self::Zbus(e) => f.write_str(&format!("ZBus Error: {e}" )), |
| 94 | Self::Zvariant(e) => f.write_str(&format!("Zvariant error: {e}" )), |
| 95 | Self::ZBusNames(e) => f.write_str(&format!("ZBus_names Error: {e}" )), |
| 96 | Self::ParseError(e) => f.write_str(e), |
| 97 | Self::PathConversionError(e) => { |
| 98 | f.write_str(&format!("ID cannot be extracted from the path: {e}" )) |
| 99 | } |
| 100 | Self::IO(e) => f.write_str(&format!("std IO Error: {e}" )), |
| 101 | Self::IntConversionError(e) => f.write_str(&format!("Integer conversion error: {e}" )), |
| 102 | Self::MissingName => f.write_str("Missing name for a bus." ), |
| 103 | Self::Infallible => { |
| 104 | f.write_str("Infallible; only to trick the compiler. This should never happen." ) |
| 105 | } |
| 106 | } |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | impl From<std::convert::Infallible> for AtspiError { |
| 111 | fn from(_e: std::convert::Infallible) -> Self { |
| 112 | Self::Infallible |
| 113 | } |
| 114 | } |
| 115 | impl From<std::num::TryFromIntError> for AtspiError { |
| 116 | fn from(e: std::num::TryFromIntError) -> Self { |
| 117 | Self::IntConversionError(e) |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | #[cfg (feature = "zbus" )] |
| 122 | impl From<zbus::fdo::Error> for AtspiError { |
| 123 | fn from(e: zbus::fdo::Error) -> Self { |
| 124 | Self::Zbus(format!(" {e:?}" )) |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | #[cfg (feature = "zbus" )] |
| 129 | impl From<zbus::Error> for AtspiError { |
| 130 | fn from(e: zbus::Error) -> Self { |
| 131 | Self::Zbus(format!(" {e:?}" )) |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | impl From<zbus_names::Error> for AtspiError { |
| 136 | fn from(e: zbus_names::Error) -> Self { |
| 137 | Self::ZBusNames(e) |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | impl From<zvariant::Error> for AtspiError { |
| 142 | fn from(e: zvariant::Error) -> Self { |
| 143 | Self::Zvariant(e) |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | impl From<std::io::Error> for AtspiError { |
| 148 | fn from(e: std::io::Error) -> Self { |
| 149 | Self::IO(e) |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | impl From<ObjectPathConversionError> for AtspiError { |
| 154 | fn from(e: ObjectPathConversionError) -> AtspiError { |
| 155 | Self::PathConversionError(e) |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | #[allow (clippy::module_name_repetitions)] |
| 160 | #[derive (Clone, Debug)] |
| 161 | pub enum ObjectPathConversionError { |
| 162 | NoIdAvailable, |
| 163 | ParseError(<i64 as std::str::FromStr>::Err), |
| 164 | } |
| 165 | impl std::fmt::Display for ObjectPathConversionError { |
| 166 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| 167 | match self { |
| 168 | Self::NoIdAvailable => f.write_str(data:"No ID available in the path." ), |
| 169 | Self::ParseError(e: &ParseIntError) => f.write_str(&format!("Failure to parse: {e}" )), |
| 170 | } |
| 171 | } |
| 172 | } |
| 173 | impl std::error::Error for ObjectPathConversionError {} |
| 174 | |