#[macro_use]
extern crate tracing;
use async_trait::async_trait;
use vaultrs::{
api::AuthInfo,
client::{Client, VaultClient},
error::ClientError,
};
pub mod engines;
pub mod method;
#[async_trait]
pub trait LoginMethod: Sync + Send {
async fn login(&self, client: &impl Client, mount: &str) -> Result<AuthInfo, ClientError>;
}
#[async_trait]
pub trait MultiLoginMethod: Sync + Send {
type Callback: MultiLoginCallback;
async fn login(&self, client: &impl Client, mount: &str)
-> Result<Self::Callback, ClientError>;
}
#[async_trait]
pub trait MultiLoginCallback: Sync + Send {
async fn callback(self, client: &impl Client, mount: &str) -> Result<AuthInfo, ClientError>;
}
#[async_trait]
pub trait LoginClient: Client + Sized {
#[instrument(skip(self, method), err)]
async fn login<M: 'static + LoginMethod>(
&mut self,
mount: &str,
method: &M,
) -> Result<(), ClientError> {
let info = method.login(self, mount).await?;
self.set_token(info.client_token.as_str());
Ok(())
}
#[instrument(skip(self, method), err)]
async fn login_multi<M: 'static + MultiLoginMethod>(
&self,
mount: &str,
method: M,
) -> Result<M::Callback, ClientError> {
method.login(self, mount).await
}
#[instrument(skip(self, callback), err)]
async fn login_multi_callback<C: 'static + MultiLoginCallback>(
&mut self,
mount: &str,
callback: C,
) -> Result<(), ClientError> {
let info = callback.callback(self, mount).await?;
self.set_token(info.client_token.as_str());
Ok(())
}
}
impl LoginClient for VaultClient {}