use super::error::*; use async_trait::async_trait; use serde::{Deserialize, Serialize}; use std::collections::HashSet; pub use lldap_model::{ AddUserToGroupRequest, CreateGroupRequest, CreateUserRequest, DeleteUserRequest, Group, User, UserDetailsRequest, }; #[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Clone)] pub struct BindRequest { pub name: String, pub password: String, } #[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Clone)] pub enum RequestFilter { And(Vec), Or(Vec), Not(Box), Equality(String, String), } #[async_trait] pub trait LoginHandler: Clone + Send { async fn bind(&self, request: BindRequest) -> Result<()>; } #[async_trait] pub trait BackendHandler: Clone + Send { async fn list_users(&self, filters: Option) -> Result>; async fn list_groups(&self) -> Result>; async fn get_user_details(&self, request: UserDetailsRequest) -> Result; async fn create_user(&self, request: CreateUserRequest) -> Result<()>; async fn delete_user(&self, request: DeleteUserRequest) -> Result<()>; async fn create_group(&self, request: CreateGroupRequest) -> Result; async fn add_user_to_group(&self, request: AddUserToGroupRequest) -> Result<()>; async fn get_user_groups(&self, user: &str) -> Result>; } #[cfg(test)] mockall::mock! { pub TestBackendHandler{} impl Clone for TestBackendHandler { fn clone(&self) -> Self; } #[async_trait] impl BackendHandler for TestBackendHandler { async fn list_users(&self, filters: Option) -> Result>; async fn list_groups(&self) -> Result>; async fn get_user_details(&self, request: UserDetailsRequest) -> Result; async fn create_user(&self, request: CreateUserRequest) -> Result<()>; async fn delete_user(&self, request: DeleteUserRequest) -> Result<()>; async fn create_group(&self, request: CreateGroupRequest) -> Result; async fn get_user_groups(&self, user: &str) -> Result>; async fn add_user_to_group(&self, request: AddUserToGroupRequest) -> Result<()>; } #[async_trait] impl LoginHandler for TestBackendHandler { async fn bind(&self, request: BindRequest) -> Result<()>; } }