calloop/
error.rs

1//! Error types used and generated by Calloop.
2//!
3//! This module contains error types for Calloop's operations. They are designed
4//! to make it easy to deal with errors arising from Calloop's internal I/O and
5//! other operations.
6//!
7//! There are two top-level error types:
8//!
9//! - [`Error`]: used by callback functions, internal operations, and some event
10//!   loop API calls
11//!
12//! - [`InsertError`]: used primarily by the [`insert_source()`] method when an
13//!   event source cannot be added to the loop and needs to be given back to the
14//!   caller
15//!
16//! [`insert_source()`]: crate::LoopHandle::insert_source()
17
18use std::fmt::{self, Debug, Formatter};
19
20/// The primary error type used by Calloop covering internal errors and I/O
21/// errors that arise during loop operations such as source registration or
22/// event dispatching.
23#[derive(thiserror::Error, Debug)]
24pub enum Error {
25    /// When an event source is registered (or re- or un-registered) with the
26    /// event loop, this error variant will occur if the token Calloop uses to
27    /// keep track of the event source is not valid.
28    #[error("invalid token provided to internal function")]
29    InvalidToken,
30
31    /// This variant wraps a [`std::io::Error`], which might arise from
32    /// Calloop's internal operations.
33    #[error("underlying IO error")]
34    IoError(#[from] std::io::Error),
35
36    /// Any other unexpected error kind (most likely from a user implementation of
37    /// [`EventSource::process_events()`]) will be wrapped in this.
38    ///
39    /// [`EventSource::process_events()`]: crate::EventSource::process_events()
40    #[error("other error during loop operation")]
41    OtherError(#[from] Box<dyn std::error::Error + Sync + Send>),
42}
43
44impl From<Error> for std::io::Error {
45    /// Converts Calloop's error type into a [`std::io::Error`].
46    fn from(err: Error) -> Self {
47        match err {
48            Error::IoError(source) => source,
49            Error::InvalidToken => Self::new(std::io::ErrorKind::InvalidInput, err.to_string()),
50            Error::OtherError(source) => Self::new(std::io::ErrorKind::Other, source),
51        }
52    }
53}
54
55/// [`Result`] alias using Calloop's error type.
56pub type Result<T> = core::result::Result<T, Error>;
57
58/// An error generated when trying to insert an event source
59#[derive(thiserror::Error)]
60#[error("error inserting event source")]
61pub struct InsertError<T> {
62    /// The source that could not be inserted
63    pub inserted: T,
64    /// The generated error
65    #[source]
66    pub error: Error,
67}
68
69impl<T> Debug for InsertError<T> {
70    #[cfg_attr(feature = "nightly_coverage", coverage(off))]
71    fn fmt(&self, formatter: &mut Formatter) -> core::result::Result<(), fmt::Error> {
72        write!(formatter, "{:?}", self.error)
73    }
74}
75
76impl<T> From<InsertError<T>> for crate::Error {
77    /// Converts the [`InsertError`] into Calloop's error type, throwing away
78    /// the contained source.
79    #[cfg_attr(feature = "nightly_coverage", coverage(off))]
80    fn from(e: InsertError<T>) -> crate::Error {
81        e.error
82    }
83}