use reqwest::Method;
use crate::{objects, request_builder, Credentials, Error};
request_builder!(
pub CreateRequest {
request_id: Option<String>,
},
Method::POST,
("https://www.googleapis.com/drive/v3/drives"),
drive_info: Option<objects::DriveInfo>
);
impl CreateRequest {
pub fn execute( &self ) -> Result<objects::DriveInfo, Error> {
let drive_info = self.drive_info.clone().unwrap_or_default();
let drive_info_string = serde_json::to_string(&drive_info)?;
let content_length = drive_info_string.as_bytes().len();
let request = self.build()?
.header( "Content-Length", content_length.to_string() )
.body(drive_info_string);
let response = request.send()?;
if !response.status().is_success() {
return Err( response.into() )
}
Ok( serde_json::from_str( &response.text()? )? )
}
}
request_builder!(
pub DeleteRequest {
use_domain_admin_access: Option<bool>,
allow_item_deletion: Option<bool>,
},
Method::DELETE,
("https://www.googleapis.com/drive/v3/drives/{drive_id}", drive_id),
);
impl DeleteRequest {
pub fn execute( &self ) -> Result<(), Error> {
self.send()?;
Ok(())
}
}
request_builder!(
pub GetRequest {
use_domain_admin_access: Option<bool>,
},
Method::GET,
("https://www.googleapis.com/drive/v3/drives/{drive_id}", drive_id),
);
impl GetRequest {
pub fn execute( &self ) -> Result<objects::DriveInfo, Error> {
let response = self.send()?;
Ok( serde_json::from_str( &response.text()? )? )
}
}
request_builder!(
pub HideRequest {},
Method::POST,
("https://www.googleapis.com/drive/v3/drives/{drive_id}/hide", drive_id),
);
impl HideRequest {
pub fn execute( &self ) -> Result<objects::DriveInfo, Error> {
let response = self.send()?;
Ok( serde_json::from_str( &response.text()? )? )
}
}
request_builder!(
pub ListRequest {
page_size: Option<i64>,
page_token: Option<String>,
q: Option<String>,
use_domain_admin_access: Option<bool>,
},
Method::GET,
("https://www.googleapis.com/drive/v3/drives"),
);
impl ListRequest {
pub fn execute( &self ) -> Result<objects::DriveInfoList, Error> {
let response = self.send()?;
Ok( serde_json::from_str( &response.text()? )? )
}
}
request_builder!(
pub UnhideRequest {},
Method::POST,
("https://www.googleapis.com/drive/v3/drives/{drive_id}/unhide", drive_id),
);
impl UnhideRequest {
pub fn execute( &self ) -> Result<objects::DriveInfo, Error> {
let response = self.send()?;
Ok( serde_json::from_str( &response.text()? )? )
}
}
request_builder!(
pub UpdateRequest {
use_domain_admin_access: Option<bool>,
},
Method::PATCH,
("https://www.googleapis.com/drive/v3/drives/{drive_id}", drive_id),
drive_info: Option<objects::DriveInfo>
);
impl UpdateRequest {
pub fn execute( &self ) -> Result<objects::DriveInfo, Error> {
let drive_info = self.drive_info.clone().unwrap_or_default();
let drive_info_string = serde_json::to_string(&drive_info)?;
let content_length = drive_info_string.as_bytes().len();
let request = self.build()?
.header( "Content-Length", content_length.to_string() )
.body(drive_info_string);
let response = request.send()?;
if !response.status().is_success() {
return Err( response.into() )
}
Ok( serde_json::from_str( &response.text()? )? )
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Drives {
credentials: Credentials,
}
impl Drives {
pub fn new( credentials: &Credentials ) -> Self {
Self { credentials: credentials.clone() }
}
pub fn create( &self ) -> CreateRequest {
CreateRequest::new(&self.credentials)
}
pub fn delete<T: AsRef<str>> ( &self, drive_id: T ) -> DeleteRequest {
DeleteRequest::new(&self.credentials, drive_id)
}
pub fn get<T: AsRef<str>> ( &self, drive_id: T ) -> GetRequest {
GetRequest::new(&self.credentials, drive_id)
}
pub fn hide<T: AsRef<str>> ( &self, drive_id: T ) -> HideRequest {
HideRequest::new(&self.credentials, drive_id)
}
pub fn list( &self ) -> ListRequest {
ListRequest::new(&self.credentials)
}
pub fn unhide<T: AsRef<str>> ( &self, drive_id: T ) -> UnhideRequest {
UnhideRequest::new(&self.credentials, drive_id)
}
pub fn update<T: AsRef<str>> ( &self, drive_id: T ) -> UpdateRequest {
UpdateRequest::new(&self.credentials, drive_id)
}
}
#[cfg(test)]
mod tests {
use super::Drives;
use crate::ErrorKind;
use crate::utils::test::{INVALID_CREDENTIALS, VALID_CREDENTIALS};
fn get_resource() -> Drives {
Drives::new(&VALID_CREDENTIALS)
}
fn get_invalid_resource() -> Drives {
Drives::new(&INVALID_CREDENTIALS)
}
#[test]
fn new_test() {
let valid_resource = get_resource();
let invalid_resource = get_invalid_resource();
assert_eq!( valid_resource.credentials, VALID_CREDENTIALS.clone() );
assert_eq!( invalid_resource.credentials, INVALID_CREDENTIALS.clone() );
}
#[test]
fn create_invalid_test() {
let response = get_invalid_resource().create()
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn delete_invalid_test() {
let response = get_invalid_resource().delete("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn get_invalid_test() {
let response = get_invalid_resource().get("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn hide_invalid_test() {
let response = get_invalid_resource().hide("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn list_test() {
let response = get_resource().list()
.execute();
assert!( response.is_ok() );
}
#[test]
fn list_invalid_test() {
let response = get_invalid_resource().list()
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn unhide_invalid_test() {
let response = get_invalid_resource().unhide("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn update_invalid_test() {
let response = get_invalid_resource().update("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
}