google_api_rust_client_unoffical/services/
mod.rs1pub 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}