use reqwest::Method;
use std::collections::HashMap;
use drive_v3_macros::{DriveRequestBuilder, request};
use super::DriveRequestBuilder;
use crate::{objects, Credentials, Error, ErrorKind};
#[request(
method=Method::GET,
url="https://www.googleapis.com/drive/v3/changes/startPageToken",
)]
#[derive(DriveRequestBuilder)]
pub struct GetStartPageTokenRequest {
#[drive_v3(parameter)]
drive_id: Option<String>,
#[drive_v3(parameter)]
supports_all_drives: Option<bool>,
}
impl GetStartPageTokenRequest {
pub fn execute( &self ) -> crate::Result<String> {
let response = self.send()?;
let response_text = response.text()?;
let parsed_json = serde_json::from_str::<HashMap<&str, String>> (&response_text)?;
match parsed_json.get("startPageToken") {
Some(token) => Ok( token.clone() ),
#[cfg(not(tarpaulin_include))]
None => Err( Error::new(
ErrorKind::Json,
"the response did not contain the 'startPageToken' field",
) )
}
}
}
#[request(
method=Method::GET,
url="https://www.googleapis.com/drive/v3/changes",
returns=objects::ChangeList,
)]
#[derive(DriveRequestBuilder)]
pub struct ListRequest {
#[drive_v3(parameter)]
drive_id: Option<String>,
#[drive_v3(parameter)]
include_corpus_removals: Option<bool>,
#[drive_v3(parameter)]
include_items_from_all_drives: Option<bool>,
#[drive_v3(parameter)]
include_removed: Option<bool>,
#[drive_v3(parameter)]
page_size: Option<i64>,
#[drive_v3(parameter)]
page_token: Option<String>,
#[drive_v3(parameter)]
restrict_to_my_drive: Option<bool>,
#[drive_v3(parameter)]
spaces: Option<String>,
#[drive_v3(parameter)]
supports_all_drives: Option<bool>,
#[drive_v3(parameter)]
include_permissions_for_view: Option<String>,
#[drive_v3(parameter)]
include_labels: Option<String>,
}
#[request(
method=Method::POST,
url="https://www.googleapis.com/drive/v3/changes/watch",
returns=objects::Channel,
)]
#[derive(DriveRequestBuilder)]
pub struct WatchRequest {
#[drive_v3(parameter)]
drive_id: Option<String>,
#[drive_v3(parameter)]
include_corpus_removals: Option<bool>,
#[drive_v3(parameter)]
include_items_from_all_drives: Option<bool>,
#[drive_v3(parameter)]
include_removed: Option<bool>,
#[drive_v3(parameter)]
page_size: Option<i64>,
#[drive_v3(parameter)]
page_token: Option<String>,
#[drive_v3(parameter)]
restrict_to_my_drive: Option<bool>,
#[drive_v3(parameter)]
spaces: Option<String>,
#[drive_v3(parameter)]
supports_all_drives: Option<bool>,
#[drive_v3(parameter)]
include_permissions_for_view: Option<String>,
#[drive_v3(parameter)]
include_labels: Option<String>,
#[drive_v3(body)]
channel: Option<objects::Channel>
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Changes {
credentials: Credentials,
}
impl Changes {
pub fn new( credentials: &Credentials ) -> Self {
Self { credentials: credentials.clone() }
}
pub fn get_start_page_token( &self ) -> GetStartPageTokenRequest {
GetStartPageTokenRequest::new(&self.credentials)
}
pub fn list( &self ) -> ListRequest {
ListRequest::new(&self.credentials)
}
pub fn watch( &self ) -> WatchRequest {
WatchRequest::new(&self.credentials)
}
}
#[cfg(test)]
mod tests {
use super::Changes;
use crate::{objects, ErrorKind};
use crate::utils::test::{INVALID_CREDENTIALS, VALID_CREDENTIALS};
fn get_resource() -> Changes {
Changes::new(&VALID_CREDENTIALS)
}
fn get_invalid_resource() -> Changes {
Changes::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 get_start_page_token_invalid_response_test() {
let response = get_invalid_resource().get_start_page_token()
.drive_id("test-drive-id")
.supports_all_drives(true)
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn list_invalid_response_test() {
let response = get_invalid_resource().list()
.drive_id("test-drive-id")
.page_token("test-page-token")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn watch_invalid_response_test() {
let channel = objects::Channel::from("test-channel-id", "test-address");
let response = get_invalid_resource().watch()
.drive_id("test-drive-id")
.page_token("test-page-token")
.channel(&channel)
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
}