use common::Identity; use secret::SecretKind; #[macro_export] macro_rules! impl_validator_using_provider { ( $validator:ty, $secret:ty ) => { impl $crate::server::Validator<$secret> for $validator { fn validate( &self, identity: &$crate::common::Identity, value: &<$secret as sasl::secret::SecretKind>::Value, ) -> Result<(), String> { if &(self as &$crate::server::Provider<$secret>).provide(identity)? == value { Ok(()) } else { Err("authentication failure".to_owned()) } } } }; } pub trait Provider: Validator { fn provide(&self, identity: &Identity) -> Result; } pub trait Validator { fn validate(&self, identity: &Identity, value: &S::Value) -> Result<(), String>; } pub trait Mechanism { fn name(&self) -> &str; fn respond(&mut self, payload: &[u8]) -> Result; } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Response { Success(Identity, Vec), Proceed(Vec), } pub mod mechanisms;