huaweicloud_sdk_rust_obs/
error.rs

1use reqwest::StatusCode;
2use serde::Deserialize;
3use thiserror::Error;
4
5use crate::model::ErrorResponse;
6
7#[derive(Error, Debug)]
8pub enum ObsError {
9    #[error("request client build fail")]
10    Request(#[from] reqwest::Error),
11
12    #[error("ak or sk not provided")]
13    Security,
14
15    #[error("operation is not valid, status:{status:?}, message:{message:?}")]
16    Response { status: StatusCode, message: String },
17
18    #[error("parse or convert json error")]
19    ParseOrConvert,
20
21    #[error("next position error")]
22    NextPosition,
23
24    #[error("serialize error")]
25    Serialize(#[from] serde_xml_rs::Error),
26    #[error("unknown data store error")]
27    Unknown,
28}
29
30pub fn status_to_response<'de, T>(status: StatusCode, text: String) -> Result<T, ObsError>
31where
32    T: Deserialize<'de>,
33{
34    match status {
35        StatusCode::OK => {
36            let r: T = serde_xml_rs::from_str(&text)?;
37            Ok(r)
38        }
39        StatusCode::FORBIDDEN => {
40            let er: ErrorResponse = serde_xml_rs::from_str(&text)?;
41            Err(ObsError::Response {
42                status: StatusCode::FORBIDDEN,
43                message: er.message,
44            })
45        }
46        _ => Err(ObsError::Unknown),
47    }
48}