1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use crate::client::{AuthorizedClient, ID}; use crate::errors::{Error, ErrorKind, Result}; use failure::Fail; use reqwest::StatusCode; use serde::{self, Deserialize, Serialize}; #[derive(Serialize, Debug)] struct DeleteAction<'a> { action: &'a str, params: Documents<'a>, } #[derive(Serialize, Debug)] struct Documents<'a> { documents: &'a [&'a str], } impl<'a> DeleteAction<'a> { pub fn new(documents: &'a [&'a str]) -> Self { let params = Documents { documents }; DeleteAction { action: "delete", params, } } } #[derive(Serialize, Deserialize, Debug)] struct FailedDocuments { #[serde(rename = "failed-documents")] failed_documents: Vec<ID>, } pub fn delete_documents(authorized_client: &AuthorizedClient, document_ids: &[&str]) -> Result<()> { let url = format!("https://api.{}/v2/documents", authorized_client.base_url); let delete_action = DeleteAction::new(document_ids); let mut response = authorized_client .http_client .post(&url) .bearer_auth(&authorized_client.token.access_token) .json(&delete_action) .send() .map_err(|e| e.context(ErrorKind::HttpRequestFailed))?; if response.status() != StatusCode::NO_CONTENT { let status_code = response.status(); let body = response.text().map_err(|e| e.context(ErrorKind::FailedToProcessHttpResponse("reading body".to_string())))?; return Err(Error::from(ErrorKind::ApiCallFailed(status_code, body))); } else { let failed_documents = response.json::<FailedDocuments>(); if let Ok(failed_documents) = failed_documents { return Err(Error::from(ErrorKind::FailedDocuments( failed_documents.failed_documents, ))); } } Ok(()) }