backblaze_b2_client/
error.rs1use 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 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 {}