cloud_storage/resources/
service_account.rs1#[derive(serde::Deserialize, Debug)]
3pub struct ServiceAccount {
4 #[serde(rename = "type")]
6 pub r#type: String,
7 pub project_id: String,
9 pub private_key_id: String,
11 pub private_key: String,
13 pub client_email: String,
15 pub client_id: String,
17 pub auth_uri: String,
19 pub token_uri: String,
21 pub auth_provider_x509_cert_url: String,
23 pub client_x509_cert_url: String,
25}
26
27impl ServiceAccount {
28 pub(crate) fn get() -> Self {
29 dotenv::dotenv().ok();
30 let credentials_json = std::env::var("SERVICE_ACCOUNT")
31 .or_else(|_| std::env::var("GOOGLE_APPLICATION_CREDENTIALS"))
32 .map(|path| std::fs::read_to_string(path).expect("SERVICE_ACCOUNT file not found"))
33 .or_else(|_| std::env::var("SERVICE_ACCOUNT_JSON"))
34 .or_else(|_| std::env::var("GOOGLE_APPLICATION_CREDENTIALS_JSON"))
35 .expect(
36 "SERVICE_ACCOUNT(_JSON) or GOOGLE_APPLICATION_CREDENTIALS(_JSON) environment parameter required",
37 );
38 let account: Self =
39 serde_json::from_str(&credentials_json).expect("SERVICE_ACCOUNT file not valid");
40 assert_eq!(
41 account.r#type, "service_account",
42 "`type` parameter of `SERVICE_ACCOUNT` variable is not 'service_account'"
43 );
44 account
45 }
46}