cipherstash-client 0.34.1-alpha.2

The official CipherStash SDK
Documentation
pub mod service_access_key_credentials;
pub mod service_token;
pub mod service_user_credentials;
use async_trait::async_trait;
use std::time::Duration;

pub use service_access_key_credentials::ServiceAccessKeyCredentials;
pub use service_token::ServiceToken;
pub use service_user_credentials::ServiceUserCredentials;

use super::{
    user_credentials::UserCredentials, AutoRefreshable, ClearTokenError, Credentials, GetTokenError,
};

pub enum ServiceCredentials {
    // FIXME: Service credentials should never use an access key - the access key should be used to get a service token
    AccessKey(Box<ServiceAccessKeyCredentials>),
    ConsoleAuth(Box<ServiceUserCredentials<UserCredentials>>),
}

#[async_trait]
impl Credentials for ServiceCredentials {
    type Token = ServiceToken;

    async fn get_token(&self) -> Result<Self::Token, GetTokenError> {
        match self {
            ServiceCredentials::AccessKey(ak) => ak.get_token().await,
            ServiceCredentials::ConsoleAuth(c) => c.get_token().await,
        }
    }

    async fn clear_token(&self) -> Result<(), ClearTokenError> {
        match self {
            ServiceCredentials::AccessKey(ak) => ak.clear_token().await,
            ServiceCredentials::ConsoleAuth(c) => c.clear_token().await,
        }
    }
}

#[async_trait]
impl AutoRefreshable for ServiceCredentials {
    async fn refresh(&self) -> Duration {
        match self {
            ServiceCredentials::AccessKey(ak) => ak.refresh().await,
            ServiceCredentials::ConsoleAuth(c) => c.refresh().await,
        }
    }
}