#[cfg(feature = "x509")]
mod x509;
mod header;
#[cfg(feature = "jwt")]
mod jwt;
use crate::transport::connect;
use crate::transport::Endpoint;
use crate::workload_api::client::header::MetadataAdder;
use crate::workload_api::error::WorkloadApiError;
use crate::workload_api::pb::workload::spiffe_workload_api_client::SpiffeWorkloadApiClient;
#[derive(Debug, Clone)]
pub struct WorkloadApiClient {
endpoint: Endpoint,
client: SpiffeWorkloadApiClient<
tonic::service::interceptor::InterceptedService<tonic::transport::Channel, MetadataAdder>,
>,
}
impl WorkloadApiClient {
pub const fn endpoint(&self) -> &Endpoint {
&self.endpoint
}
pub async fn connect(endpoint: Endpoint) -> Result<Self, WorkloadApiError> {
let channel = connect(&endpoint).await?;
Ok(Self {
endpoint,
client: SpiffeWorkloadApiClient::with_interceptor(channel, MetadataAdder {}),
})
}
pub async fn connect_to(endpoint: impl AsRef<str>) -> Result<Self, WorkloadApiError> {
let endpoint = Endpoint::parse(endpoint.as_ref())?;
Self::connect(endpoint).await
}
pub async fn connect_env() -> Result<Self, WorkloadApiError> {
let endpoint = crate::workload_api::endpoint::from_env()?;
Self::connect(endpoint).await
}
pub fn new_with_channel(endpoint: Endpoint, channel: tonic::transport::Channel) -> Self {
Self {
endpoint,
client: SpiffeWorkloadApiClient::with_interceptor(channel, MetadataAdder {}),
}
}
}
impl WorkloadApiClient {
async fn first_message<T>(mut stream: tonic::Streaming<T>) -> Result<T, WorkloadApiError> {
stream
.message()
.await?
.ok_or(WorkloadApiError::EmptyResponse)
}
}