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}