backblaze_b2_client/
error.rs

1use core::fmt;
2use std::{error::Error, num::NonZeroU16};
3
4use serde::{Deserialize, Serialize};
5
6use crate::definitions::shared::B2KeyCapability;
7
8#[derive(Debug)]
9pub enum B2Error {
10    // NotAuthenticated,
11    JsonParseError(serde_json::Error),
12    RequestError(B2RequestError),
13    RequestSendError(reqwest::Error),
14    MissingCapability(B2KeyCapability),
15    InvalidHeaders(IntoHeaderMapError),
16}
17
18impl Error for B2Error {}
19
20impl fmt::Display for B2Error {
21    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
22        write!(f, "B2 request encountered an error, ")?;
23
24        match self {
25            Self::JsonParseError(err) => write!(f, "Failed to parse JSON: {}", err),
26            Self::RequestError(err) => write!(f, "Request returned an error: {}", err),
27            Self::RequestSendError(err) => write!(f, "Failed to send request: {}", err),
28            Self::MissingCapability(capability) => {
29                write!(f, "Client is missing capability: {}", capability)
30            }
31            Self::InvalidHeaders(err) => write!(f, "Invalid headers passed: {}", err),
32        }
33    }
34}
35
36#[derive(Debug)]
37pub enum IntoHeaderMapError {
38    InvalidObject,
39    SerializationFailed(serde_json::Error),
40    InvalidHeaderName(String),
41    InvalidHeaderValue(String),
42}
43
44impl Error for IntoHeaderMapError {}
45
46impl fmt::Display for IntoHeaderMapError {
47    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
48        match self {
49            Self::InvalidObject => write!(
50                f,
51                "Object that implemented `IntoHeaderMap` does not serialize into an object."
52            ),
53            Self::SerializationFailed(err) => write!(f, "Failed to serialize object: {}", err),
54            Self::InvalidHeaderName(name) => write!(f, "[{}] is not a valid header name.", name),
55            Self::InvalidHeaderValue(value) => {
56                write!(f, "[{}] is not a valid header value.", value)
57            }
58        }
59    }
60}
61
62impl From<IntoHeaderMapError> for B2Error {
63    fn from(error: IntoHeaderMapError) -> Self {
64        B2Error::InvalidHeaders(error)
65    }
66}
67
68#[derive(Clone, Deserialize, Debug, Serialize)]
69pub struct B2RequestError {
70    pub status: NonZeroU16,
71    pub code: String,
72    pub message: Option<String>,
73}
74
75impl fmt::Display for B2RequestError {
76    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77        write!(f, "{}", serde_json::to_string(self).expect("Valid format"))
78    }
79}
80
81impl Error for B2RequestError {}