use google_docs1::Docs;
use google_docs1::common::{Error as ApiError, GetToken};
use google_drive3::DriveHub;
use hyper_util::client::legacy::Client;
use hyper_util::rt::TokioExecutor;
use crate::auth::{Connector, https_connector};
use crate::error::{Error, Result};
pub struct GoogleClient {
pub docs: Docs<Connector>,
pub drive: DriveHub<Connector>,
}
impl GoogleClient {
pub fn new<A: GetToken + Clone + 'static>(auth: A) -> Result<Self> {
let docs_client = Client::builder(TokioExecutor::new()).build(https_connector()?);
let drive_client = Client::builder(TokioExecutor::new()).build(https_connector()?);
let docs = Docs::new(docs_client, auth.clone());
let drive = DriveHub::new(drive_client, auth);
Ok(Self { docs, drive })
}
pub fn set_base_url(&mut self, base_url: &str) {
let normalized = if base_url.ends_with('/') {
base_url.to_owned()
} else {
format!("{base_url}/")
};
let _ = self.docs.base_url(normalized.clone());
let _ = self.docs.root_url(normalized.clone());
let _ = self.drive.base_url(normalized.clone());
let _ = self.drive.root_url(normalized);
}
}
#[allow(
clippy::needless_pass_by_value,
reason = "used directly as a `map_err` adapter, which passes the error by value"
)]
pub(crate) fn map_api_error(error: ApiError) -> Error {
Error::Google(error.to_string())
}