spiffe-rs 0.1.0

Rust port of spiffe-go with SPIFFE IDs, bundles, SVIDs, Workload API client, federation helpers, and rustls-based SPIFFE TLS utilities.
Documentation
use crate::spiffetls::tlsconfig;
use rustls::{ClientConfig, ServerConfig};

pub trait DialOption: Send + Sync {
    fn apply(&self, config: &mut DialConfig);
}

pub trait ListenOption: Send + Sync {
    fn apply(&self, config: &mut ListenConfig);
}

pub struct DialConfig {
    pub base_client_config: Option<ClientConfig>,
    pub tls_options: Vec<tlsconfig::TlsOption>,
}

impl Default for DialConfig {
    fn default() -> Self {
        Self {
            base_client_config: None,
            tls_options: Vec::new(),
        }
    }
}

pub struct ListenConfig {
    pub base_server_config: Option<ServerConfig>,
    pub tls_options: Vec<tlsconfig::TlsOption>,
}

impl Default for ListenConfig {
    fn default() -> Self {
        Self {
            base_server_config: None,
            tls_options: Vec::new(),
        }
    }
}

pub fn with_dial_tls_config_base(config: ClientConfig) -> Box<dyn DialOption> {
    Box::new(DialOptionFn(move |opts: &mut DialConfig| {
        opts.base_client_config = Some(config.clone());
    }))
}

pub fn with_dial_tls_options(options: Vec<tlsconfig::TlsOption>) -> Box<dyn DialOption> {
    Box::new(DialOptionFn(move |opts: &mut DialConfig| {
        opts.tls_options = options.clone();
    }))
}

pub fn with_listen_tls_config_base(config: ServerConfig) -> Box<dyn ListenOption> {
    Box::new(ListenOptionFn(move |opts: &mut ListenConfig| {
        opts.base_server_config = Some(config.clone());
    }))
}

pub fn with_listen_tls_options(options: Vec<tlsconfig::TlsOption>) -> Box<dyn ListenOption> {
    Box::new(ListenOptionFn(move |opts: &mut ListenConfig| {
        opts.tls_options = options.clone();
    }))
}

struct DialOptionFn<F>(F);

impl<F> DialOption for DialOptionFn<F>
where
    F: Fn(&mut DialConfig) + Send + Sync,
{
    fn apply(&self, config: &mut DialConfig) {
        (self.0)(config)
    }
}

struct ListenOptionFn<F>(F);

impl<F> ListenOption for ListenOptionFn<F>
where
    F: Fn(&mut ListenConfig) + Send + Sync,
{
    fn apply(&self, config: &mut ListenConfig) {
        (self.0)(config)
    }
}