parent
							
								
									cb0c10e064
								
							
						
					
					
						commit
						6ad5c306e4
					
				
				 10 changed files with 240 additions and 49 deletions
			
			
		@ -1,2 +0,0 @@ | 
				
			|||||||
#!/bin/bash | 
					 | 
				
			||||||
docker run -v $PWD:/volume  -w /volume -it clux/muslrust cargo build | 
					 | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					#!/bin/bash | 
				
			||||||
 | 
					docker run \ | 
				
			||||||
 | 
					    -v $PWD:/volume \ | 
				
			||||||
 | 
					    -v cargo-cache:/root/.cargo/registry \ | 
				
			||||||
 | 
					    -w /volume \ | 
				
			||||||
 | 
					    -it \ | 
				
			||||||
 | 
					    clux/muslrust \ | 
				
			||||||
 | 
					    cargo $@ | 
				
			||||||
@ -1,27 +1,87 @@ | 
				
			|||||||
use std::fmt; | 
					use std::fmt; | 
				
			||||||
 | 
					use std::error::Error as StdError; | 
				
			||||||
 | 
					use reqwest::Error as ReqError; | 
				
			||||||
use serde::{ | 
					use serde::{ | 
				
			||||||
    Serialize, | 
					    Serialize, | 
				
			||||||
    Deserialize | 
					    Deserialize | 
				
			||||||
}; | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Serialize, Deserialize, Clone)] | 
					pub type BoxError = Box<(dyn StdError + Send + Sync + 'static)>; | 
				
			||||||
pub enum UError { | 
					pub type UResult<T> = std::result::Result<T, UError>; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Serialize, Deserialize, Clone, Debug)] | 
				
			||||||
 | 
					pub enum UErrType { | 
				
			||||||
 | 
					    ConnectionError, | 
				
			||||||
 | 
					    ParseError, | 
				
			||||||
 | 
					    JobError, | 
				
			||||||
 | 
					    Unknown, | 
				
			||||||
    Raw(String) | 
					    Raw(String) | 
				
			||||||
} | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Serialize, Deserialize, Clone, Debug)] | 
				
			||||||
 | 
					struct Inner { | 
				
			||||||
 | 
					    err_type: UErrType, | 
				
			||||||
 | 
					    source: Option<BoxError> | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Serialize, Deserialize, Clone)] | 
				
			||||||
 | 
					pub struct UError { | 
				
			||||||
 | 
					    inner: Box<Inner> | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
impl UError { | 
					impl UError { | 
				
			||||||
    pub fn description(&self) -> String { | 
					    pub fn new<E: Into<BoxError>>(err_type: UErrType, source: Option<E>) -> Self { | 
				
			||||||
        match self { | 
					        Self { | 
				
			||||||
            UError::Raw(msg) => msg.clone() | 
					            inner: Box::new(Inner { | 
				
			||||||
 | 
					                source: source.map(Into::into), | 
				
			||||||
 | 
					                err_type | 
				
			||||||
 | 
					            }) | 
				
			||||||
        } | 
					        } | 
				
			||||||
    } | 
					    } | 
				
			||||||
} | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
impl fmt::Debug for UError { | 
					impl fmt::Debug for UError { | 
				
			||||||
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
					    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
				
			||||||
        let msg = match self { | 
					        let mut builder = f.debug_struct("errors::UError"); | 
				
			||||||
            UError::Raw(msg) => msg | 
					
 | 
				
			||||||
 | 
					        builder.field("kind", &self.inner.err_type); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if let Some(ref source) = self.inner.source { | 
				
			||||||
 | 
					            builder.field("source", source); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        builder.finish() | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl fmt::Display for UError { | 
				
			||||||
 | 
					    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
				
			||||||
 | 
					        let e_type = match self.inner.err_type { | 
				
			||||||
 | 
					            UErrType::Raw(ref msg) => msg, | 
				
			||||||
 | 
					            UErrType::ConnectionError => "Connection error", | 
				
			||||||
 | 
					            UErrType::ParseError => "Parse error", | 
				
			||||||
 | 
					            UErrType::JobError => "Job error", | 
				
			||||||
 | 
					            UErrType::Unknown => "Unknown error", | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					        f.write_str(e_type)?; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if let Some(ref e) = self.inner.source { | 
				
			||||||
 | 
					            write!(f, ": {}", e) | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            Ok(()) | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<ReqError> for UError { | 
				
			||||||
 | 
					    fn from(e: ReqError) -> Self { | 
				
			||||||
 | 
					        let err_type = if e.is_request() { | 
				
			||||||
 | 
					            UErrType::ConnectionError | 
				
			||||||
 | 
					        } else if e.is_decode() { | 
				
			||||||
 | 
					            UErrType::ParseError | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            UErrType::Unknown | 
				
			||||||
        }; | 
					        }; | 
				
			||||||
        write!(f, "{}", msg) | 
					        UError::new(err_type, Some(e)) | 
				
			||||||
    } | 
					    } | 
				
			||||||
} | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue