google_api_rust_client_unoffical/services/
mod.rs

1pub mod translate_service;
2pub mod route_service;
3pub mod service_error;
4
5use anyhow::{bail, Result};
6use reqwest::{header::{HeaderMap, HeaderValue, AUTHORIZATION, CONTENT_TYPE}, RequestBuilder};
7use service_error::ServiceErrorResponse;
8
9use crate::auth::service_account::ServiceAccountCredentials;
10
11
12#[derive(Debug, Clone)]
13struct ServiceBase {
14    api_key: Option<String>,
15    service_account_credentials: Option<ServiceAccountCredentials>,
16}
17
18impl ServiceBase {
19    fn new_with_api_key(api_key: String) -> Self {
20        return Self { api_key: Some(api_key), service_account_credentials: None }
21    }
22
23    fn new_with_credentials(service_account_credentials: ServiceAccountCredentials, scopes: Vec<&str>) -> Self {
24        let scoped_credentials = service_account_credentials.with_scopes(scopes);
25        return Self { api_key: None, service_account_credentials: Some(scoped_credentials) }
26    }
27}
28
29
30impl ServiceBase {
31
32    async fn create_headers(&mut self) -> Result<HeaderMap>{
33        let mut headers = HeaderMap::new();
34
35        if let Some(api_key) = &self.api_key {
36            headers.insert("X-goog-api-key", HeaderValue::from_str(&api_key)?);
37        } else if let Some(mut credentials) = self.service_account_credentials.to_owned() {
38            let token = credentials.get_access_token().await?;
39            self.service_account_credentials = Some(credentials);
40            headers.insert(AUTHORIZATION, HeaderValue::from_str(&format!("Bearer {}", token))?);
41        } else {
42            bail!("Unknown Auth Method!")
43        };
44
45        headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json; charset=utf-8"));
46        Ok(headers)
47    }
48
49    async fn make_request(&mut self, request: RequestBuilder) -> Result<String> {
50        let response = request.send().await?;
51        let status_code = response.status();
52        let body: String = response.text().await?;
53
54        if !status_code.is_success() {
55            let error_response: ServiceErrorResponse = serde_json::from_str(&body).unwrap_or_default();
56            bail!(format!("Response Error! Code: {}, Message: {}", error_response.error.code, error_response.error.message));
57        }
58
59        Ok(body)
60    }
61}