pico_common/
error.rs

1use super::PicoStatus;
2use std::fmt;
3use thiserror::Error;
4
5/// Error encapsulating `PicoStatus` error codes with context
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[derive(Clone, Eq, PartialEq, Debug, Error)]
8pub struct PicoError {
9    #[source]
10    pub status: PicoStatus,
11    context: Option<String>,
12}
13
14impl fmt::Display for PicoError {
15    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16        if let Some(ctx) = &self.context {
17            write!(f, "{}", ctx)
18        } else {
19            Ok(())
20        }
21    }
22}
23
24impl PicoError {
25    pub fn from_status(status: PicoStatus, context: &str) -> PicoError {
26        PicoError {
27            status,
28            context: Some(context.to_string()),
29        }
30    }
31}
32
33impl From<PicoStatus> for PicoError {
34    fn from(value: PicoStatus) -> Self {
35        PicoError {
36            status: value,
37            context: None,
38        }
39    }
40}
41
42/// A result wrapping driver error codes: `Result<T, PicoError>`
43pub type PicoResult<T> = Result<T, PicoError>;