use reqwest::Client;
use crate::list::{list_all_files, ListOptions};
use crate::types::{DriveError, DriveFile};
#[derive(Default)]
pub struct SearchOptions {
pub query: String,
pub parent_id: Option<String>,
pub include_trashed: bool,
pub page_size: Option<u32>,
pub order_by: Option<String>,
}
pub async fn search_files(
client: &Client,
access_token: &str,
opts: &SearchOptions,
) -> Result<Vec<DriveFile>, DriveError> {
let list_opts = ListOptions {
parent_id: opts.parent_id.clone(),
query: if opts.query.is_empty() {
None
} else {
Some(opts.query.clone())
},
page_size: opts.page_size,
page_token: None,
include_trashed: opts.include_trashed,
order_by: opts.order_by.clone(),
};
list_all_files(client, access_token, &list_opts).await
}
pub async fn search_by_name(
client: &Client,
access_token: &str,
name: &str,
parent_id: Option<String>,
) -> Result<Vec<DriveFile>, DriveError> {
let escaped = name.replace('\\', "\\\\").replace('\'', "\\'");
let query = format!("name contains '{}'", escaped);
let opts = SearchOptions {
query,
parent_id,
..Default::default()
};
search_files(client, access_token, &opts).await
}
pub async fn search_by_mime_type(
client: &Client,
access_token: &str,
mime_type: &str,
parent_id: Option<String>,
) -> Result<Vec<DriveFile>, DriveError> {
let escaped = mime_type.replace('\\', "\\\\").replace('\'', "\\'");
let query = format!("mimeType = '{}'", escaped);
let opts = SearchOptions {
query,
parent_id,
..Default::default()
};
search_files(client, access_token, &opts).await
}