1use 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}