umberwm/
error.rs

1use std::fmt::Display;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum Error {
6    #[error("Workspace not found")]
7    WorkspaceNotFound,
8    #[error("Action not found")]
9    ActionNotFound,
10    #[error("No screens found")]
11    NoScreensFound,
12    #[error("Window not found")]
13    WindowNotFound,
14    #[error("Failed to get window manager class")]
15    FailedToGetWmClass,
16    #[error("No mouse move start")]
17    NoMouseMoveStart,
18    #[error("No butten press geometry")]
19    NoButtonPressGeometry,
20    #[error("Failed to deserialize from JSON: {0}")]
21    FailedToDeserializeFromJson(String),
22    #[error(transparent)]
23    Error(#[from] ron::error::Error),
24    #[error(transparent)]
25    Io(#[from] std::io::Error),
26    #[error(transparent)]
27    FromUtf8(#[from] std::string::FromUtf8Error),
28    #[error(transparent)]
29    XcbGeneric(#[from] xcb::GenericError),
30}
31
32pub type Result<T, E = Error> = std::result::Result<T, E>;
33
34pub trait LogError<T> {
35    /// Converts from `Result<T, E>` to `Option<T>`, logging errors.
36    ///
37    /// Converts `self` into an `Option<T>`, consuming `self`, and logging the error, if any, to
38    /// `STDERR`.
39    fn log(self) -> Option<T>;
40}
41
42impl<T, E: Display> LogError<T> for Result<T, E> {
43    fn log(self) -> Option<T> {
44        match self {
45            Ok(x) => Some(x),
46            Err(e) => {
47                eprintln!("{}", e);
48                None
49            }
50        }
51    }
52}