diff --git a/src/client.rs b/src/client.rs index 2b9b12f..2dd756e 100644 --- a/src/client.rs +++ b/src/client.rs @@ -30,7 +30,7 @@ impl UnauthorizedClient { let redirect_url = redirect_uri .clone() .into_url() - .map_err(|e| e.context(ErrorKind::HttpRequestPrepareFailed(redirect_uri.to_string())))?; + .map_err(|e| e.context(ErrorKind::FailedToPrepareHttpRequest(redirect_uri.to_string())))?; let token = auth::authorization_code_flow(&self.client_credentials, &self.base_url, &redirect_url, code_provider)?; diff --git a/src/client/auth.rs b/src/client/auth.rs index bd2f62d..040218b 100644 --- a/src/client/auth.rs +++ b/src/client/auth.rs @@ -81,7 +81,7 @@ fn get_code( ("response_type", "code"), ]; let auth_url = Url::parse_with_params(&auth_endpoint, ¶ms) - .map_err(|e| e.context(ErrorKind::HttpRequestPrepareFailed(redirect_uri.to_string())))?; + .map_err(|e| e.context(ErrorKind::FailedToPrepareHttpRequest(redirect_uri.to_string())))?; code_provider.get_code(auth_url) } @@ -110,11 +110,11 @@ pub fn exchange_code_for_token( if response.status() != StatusCode::OK { let status_code = response.status(); - let body = response.text().map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("reading body".to_string())))?; + let body = response.text().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; return Err(Error::from(ErrorKind::ApiCallFailed(status_code, body))); } - let result = response.json().map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("parsing json".to_string()))?; + let result = response.json().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("parsing json".to_string())))?; Ok(result) } @@ -137,7 +137,7 @@ pub fn refresh_access_token(authorized_client: &AuthorizedClient) -> Result(); diff --git a/src/client/download.rs b/src/client/download.rs index 0fbac4a..8302155 100644 --- a/src/client/download.rs +++ b/src/client/download.rs @@ -97,7 +97,7 @@ fn do_download( let mut file_path = PathBuf::from(&download.dir); file_path.push(filename); - let file = File::create(file_path.as_path()).map_err(|e| e.context(ErrorKind::FileSystemFailure))?; + let file = File::create(file_path.as_path()).map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("creating file".to_string())))?; let mut writer = { if let Some(ref mut p) = progress { @@ -109,7 +109,7 @@ fn do_download( let len = response .copy_to(&mut writer) - .map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("reading body".to_string()))?; + .map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; assert_eq!(content_length, len); if let Some(ref mut p) = writer.progress { @@ -127,22 +127,22 @@ fn get_filename(response: &Response) -> Result { let header: Vec<_> = response .headers() .get(header::CONTENT_DISPOSITION) - .ok_or(ErrorKind::HttpResponseReadFailed("content disposition header".to_string())? + .ok_or(ErrorKind::FailedToProcessHttpResponse("content disposition header".to_string()))? .as_bytes() .to_vec(); let content_disposition: ContentDisposition = - ContentDisposition::parse_header(&[header]).map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("parsing content disposition header".to_string()))?; + ContentDisposition::parse_header(&[header]).map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("parsing content disposition header".to_string())))?; let mut filename = None; for cp in &content_disposition.parameters { if let DispositionParam::Filename(_, _, ref f) = *cp { - let decoded = str::from_utf8(f).map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("parsing content disposition filename".to_string()))?; + let decoded = str::from_utf8(f).map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("parsing content disposition filename".to_string())))?; filename = Some(decoded); break; } } filename - .ok_or_else(|| Error::from(ErrorKind::HttpResponseReadFailed("content disposition header filename not found".to_string())) + .ok_or_else(|| Error::from(ErrorKind::FailedToProcessHttpResponse("content disposition header filename not found".to_string()))) .map(ToString::to_string) } @@ -150,10 +150,10 @@ fn get_content_length(response: &Response) -> Result { let content_length = response .headers() .get(header::CONTENT_LENGTH) - .ok_or(ErrorKind::HttpResponseReadFailed("content length header".to_string())? + .ok_or(ErrorKind::FailedToProcessHttpResponse("content length header".to_string()))? .to_str() - .map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("parsing content length header".to_string()))? + .map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("parsing content length header".to_string())))? .parse::() - .map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("parsing content length".to_string()))?; + .map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("parsing content length".to_string())))?; Ok(content_length) } diff --git a/src/client/search.rs b/src/client/search.rs index a55d2e8..cd2989b 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -207,11 +207,11 @@ pub fn search_documents(authorized_client: &AuthorizedClient, search: Search) -> if response.status() != StatusCode::OK { let status_code = response.status(); - let body = response.text().map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("reading body".to_string()))?; + let body = response.text().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; return Err(Error::from(ErrorKind::ApiCallFailed(status_code, body))); } - let result = response.json().map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("reading body".to_string()))?; + let result = response.json().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; Ok(result) } diff --git a/src/client/upload.rs b/src/client/upload.rs index eececa1..4fee7be 100644 --- a/src/client/upload.rs +++ b/src/client/upload.rs @@ -31,8 +31,8 @@ pub struct Upload<'a> { impl<'a> Upload<'a> { pub fn new(path: &'a Path, mime_type: Mime) -> Result> { - let metadata = path.metadata().map_err(|e| e.context(ErrorKind::FileSystemFailure))?; - let filename = path.file_name().ok_or(ErrorKind::FileSystemFailure)?.to_string_lossy(); + let metadata = path.metadata().map_err(|e| e.context(ErrorKind::FailedToPrepareHttpRequest("reading file metadata".to_string())))?; + let filename = path.file_name().ok_or(ErrorKind::FailedToPrepareHttpRequest("getting filename from path".to_string()))?.to_string_lossy(); Ok(Upload { path, @@ -143,11 +143,11 @@ pub fn upload_file(authorized_client: &AuthorizedClient, upload: Upload) -> Resu * cf. https://github.com/seanmonstar/reqwest/issues/262 */ let mut body: Vec = Vec::new(); - let nodes = create_multipart(&document_metadata, &upload).map_err(|e| e.context(ErrorKind::FailedToMultipart))?; + let nodes = create_multipart(&document_metadata, &upload).map_err(|e| e.context(ErrorKind::FailedToPrepareHttpRequest("creating multipart".to_string())))?; let boundary = generate_boundary(&upload.filename.as_bytes()); let content_type: Mime = mime!(Multipart / FormData; Boundary = (boundary)); let _ = write_multipart(&mut body, &boundary.into_bytes(), &nodes) - .map_err(|e| e.context(ErrorKind::HttpRequestPrepareFailed("multipart".to_string())))?; + .map_err(|e| e.context(ErrorKind::FailedToPrepareHttpRequest("multipart".to_string())))?; let mut response: Response = authorized_client .http_client @@ -164,11 +164,11 @@ pub fn upload_file(authorized_client: &AuthorizedClient, upload: Upload) -> Resu if response.status() != StatusCode::CREATED { let status_code = response.status(); - let body = response.text().map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("reading body".to_string()))?; + let body = response.text().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; return Err(Error::from(ErrorKind::ApiCallFailed(status_code, body))); } - let result: Id = response.json().map_err(|e| e.context(ErrorKind::HttpResponseReadFailed("reading body".to_string()))?; + let result: Id = response.json().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; Ok(result.id) } @@ -180,7 +180,7 @@ fn create_multipart(metadata: &DocumentMetadata, upload: &Upload) -> Result = Vec::with_capacity(2); let json_bytes = serde_json::to_string(metadata) - .map_err(|e| e.context(ErrorKind::HttpRequestPrepareFailed("serializing doc-metadata json".to_string())))? + .map_err(|e| e.context(ErrorKind::FailedToPrepareHttpRequest("serializing doc-metadata json".to_string())))? .into_bytes(); let mut h = Headers::new(); diff --git a/src/errors.rs b/src/errors.rs index 31d18a5..6224da4 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -8,18 +8,13 @@ use std::fmt; #[derive(Eq, PartialEq, Debug, Fail)] pub enum ErrorKind { #[fail(display = "failed to prepare HTTP request, '{}'", _0)] - HttpRequestPrepareFailed(String), - #[fail(display = "failed to create multipart form")] - FailedToMultipart, + FailedToPrepareHttpRequest(String), #[fail(display = "HTTP request failed")] HttpRequestFailed, #[fail(display = "failed to read HTTP response, {}", _0)] - HttpResponseReadFailed(String), - - #[fail(display = "filesystem failure")] - FileSystemFailure, + FailedToProcessHttpResponse(String), #[fail(display = "API call failed with status code {}, '{}'", _0, _1)] ApiCallFailed(StatusCode, String), @@ -33,9 +28,8 @@ impl Clone for ErrorKind { match *self { HttpRequestFailed => HttpRequestFailed, ApiCallFailed(ref status_code, ref body) => ApiCallFailed(*status_code, body.clone()), - HttpResponseReadFailed(ref s) => HttpResponseReadFailed(s.clone()), - HttpRequestPrepareFailed(ref s) => HttpRequestPrepareFailed(s.clone()), - FileSystemFailure => FileSystemFailure, + FailedToProcessHttpResponse(ref s) => FailedToProcessHttpResponse(s.clone()), + FailedToPrepareHttpRequest(ref s) => FailedToPrepareHttpRequest(s.clone()), FailedDocuments(ref s) => FailedDocuments(s.clone()), } }