use crate::env::load_dotenv;
use serde::{Deserialize, Serialize};
use std::{env, fs};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ServiceAccountKey {
pub r#type: String,
pub project_id: String,
pub private_key_id: String,
pub private_key: String,
pub client_email: String,
pub client_id: String,
pub auth_uri: String,
pub token_uri: String,
pub auth_provider_x509_cert_url: String,
pub client_x509_cert_url: String,
pub universe_domain: String,
}
impl ServiceAccountKey {
pub fn from_file(path: &str) -> anyhow::Result<Self> {
let json_str = fs::read_to_string(path)?;
let key: Self = serde_json::from_str(&json_str)?;
Ok(key)
}
pub fn from_env(app_env: Option<String>) -> anyhow::Result<Self> {
load_dotenv(app_env);
Ok(Self {
r#type: env::var("SERVICE_ACCOUNT_KEY_TYPE")?,
project_id: env::var("SERVICE_ACCOUNT_KEY_PROJECT_ID")?,
private_key_id: env::var("SERVICE_ACCOUNT_KEY_PRIVATE_KEY_ID")?,
private_key: env::var("SERVICE_ACCOUNT_KEY_PRIVATE_KEY")?,
client_email: env::var("SERVICE_ACCOUNT_KEY_CLIENT_EMAIL")?,
client_id: env::var("SERVICE_ACCOUNT_KEY_CLIENT_ID")?,
auth_uri: env::var("SERVICE_ACCOUNT_KEY_AUTH_URI")?,
token_uri: env::var("SERVICE_ACCOUNT_KEY_TOKEN_URI")?,
auth_provider_x509_cert_url: env::var(
"SERVICE_ACCOUNT_KEY_AUTH_PROVIDER_X509_CERT_URL",
)?,
client_x509_cert_url: env::var("SERVICE_ACCOUNT_KEY_CLIENT_X509_CERT_URL")?,
universe_domain: env::var("SERVICE_ACCOUNT_KEY_UNIVERSE_DOMAIN")?,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
pub fn load_from_file() {
let result = ServiceAccountKey::from_file("key.json");
assert!(result.is_ok());
}
#[test]
pub fn load_from_env() {
let result = ServiceAccountKey::from_env(None);
assert!(result.is_ok());
}
}