r2d2_ldap/
lib.rs

1//! LDAP support for the `r2d2` connection pool.
2use ldap3::{exop::WhoAmI, LdapConn, LdapError};
3use r2d2::ManageConnection;
4
5/// An `r2d2::ManageConnection` for `ldap3::LdapConn`s.
6///
7/// ## Example
8///
9/// ```no_run
10/// use std::thread;
11/// use r2d2_ldap::LDAPConnectionManager;
12///
13/// fn main() {
14///     let pool = r2d2::Pool::new(LDAPConnectionManager("ldap://example.org")).unwrap();
15///
16///     for i in 0..10i32 {
17///         let pool = pool.clone();
18///         thread::spawn(move || {
19///             let mut ldap = pool.get().unwrap();
20///             ldap.simple_bind("uid=john,cn=users,dc=example,dc=org", "password").unwrap();
21///         });
22///     }
23/// }
24/// ```
25pub struct LDAPConnectionManager(pub &'static str);
26
27impl ManageConnection for LDAPConnectionManager {
28    type Connection = LdapConn;
29    type Error = LdapError;
30
31    fn connect(&self) -> Result<LdapConn, LdapError> {
32        LdapConn::new(self.0)
33    }
34    fn is_valid(&self, conn: &mut LdapConn) -> Result<(), LdapError> {
35        conn.extended(WhoAmI).map(|_| ())
36    }
37    fn has_broken(&self, conn: &mut LdapConn) -> bool {
38        conn.extended(WhoAmI).is_err()
39    }
40}