1use super::PicoStatus;
2use std::fmt;
3use thiserror::Error;
4
5#[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
42pub type PicoResult<T> = Result<T, PicoError>;