oss_sdk_rs/
errors.rs

1//! Copyright The NoXF/oss-rust-sdk Authors
2//! Copyright The iFREEGROUP/oss-sdk-rs Contributors
3
4use super::model::error::Error as ErrorResponse;
5use hmac::digest::InvalidLength;
6use quick_xml::Error as QxmlError;
7use reqwest::header::{InvalidHeaderValue as HttpInvalidHeaderValueError};
8use reqwest::Error as ReqwestError;
9use reqwest::{header::InvalidHeaderName as HttpInvalidHeaderNameError, StatusCode};
10use serde::{Deserialize};
11use std::io::Error as IoError;
12use std::string::FromUtf8Error;
13use thiserror::Error;
14
15#[derive(Debug, Error)]
16pub enum OSSError {
17    #[error("object operation is not valid, status:{status_code:?}, message:{message:?}")]
18    Object {
19        status_code: StatusCode,
20        message: String,
21    },
22    #[error("io error")]
23    Io(#[from] IoError),
24    #[error("string error")]
25    String(#[from] FromUtf8Error),
26    #[error("reqwest error")]
27    Reqwest(#[from] ReqwestError),
28    #[error("qxml error")]
29    Qxml(#[from] QxmlError),
30    #[error("parse xml error")]
31    XmlParse(#[from] serde_xml_rs::Error),
32    #[error("http error")]
33    Http(#[from] HttpError),
34    #[error("sign invalid length")]
35    Sign(#[from] InvalidLength),
36    #[error("unknown error")]
37    Unknown,
38}
39
40#[derive(Debug, Error)]
41pub enum HttpError {
42    #[error("invalid head value")]
43    HttpInvalidHeaderValue(#[from] HttpInvalidHeaderValueError),
44    #[error("invalid head name")]
45    HttpInvalidHeaderName(#[from] HttpInvalidHeaderNameError),
46}
47
48impl From<HttpInvalidHeaderValueError> for OSSError {
49    fn from(e: HttpInvalidHeaderValueError) -> OSSError {
50        OSSError::Http(HttpError::HttpInvalidHeaderValue(e))
51    }
52}
53
54impl From<HttpInvalidHeaderNameError> for OSSError {
55    fn from(e: HttpInvalidHeaderNameError) -> OSSError {
56        OSSError::Http(HttpError::HttpInvalidHeaderName(e))
57    }
58}
59
60pub fn status_to_response<'de, T>(status: StatusCode, text: String) -> Result<T, OSSError>
61where
62    T: Deserialize<'de> + Default,
63{
64    match status {
65        StatusCode::OK
66        | StatusCode::CREATED
67        | StatusCode::ACCEPTED
68        | StatusCode::NON_AUTHORITATIVE_INFORMATION
69        | StatusCode::NO_CONTENT
70        | StatusCode::RESET_CONTENT
71        | StatusCode::PARTIAL_CONTENT
72        | StatusCode::MULTI_STATUS
73        | StatusCode::ALREADY_REPORTED => {
74            let mut r = T::default();
75            if !text.is_empty() {
76                r = serde_xml_rs::from_str(&text)?;
77                Ok(r)
78            } else {
79                Ok(r)
80            }
81        }
82        StatusCode::BAD_REQUEST | StatusCode::FORBIDDEN | StatusCode::CONFLICT => {
83            let er: ErrorResponse = serde_xml_rs::from_str(&text)?;
84            Err(OSSError::Object {
85                status_code: status,
86                message: er.message,
87            })
88        }
89        _ => Err(OSSError::Unknown),
90    }
91}