use std::collections::HashSet;
use ldap3::controls::{MakeCritical, RelaxRules};
use ldap3::result::Result;
use ldap3::{LdapConn, Mod, Scope};
fn main() -> Result<()> {
let mut ldap = LdapConn::new("ldap://localhost:2389")?;
ldap.simple_bind("cn=Manager,dc=example,dc=org", "secret")?
.success()?;
let (rs, _res) = ldap
.search(
"uid=inejge,ou=People,dc=example,dc=org",
Scope::Base,
"(objectClass=account)",
vec!["*"],
)?
.success()?;
let mod_vec = match rs.len() {
0 => vec![
Mod::Delete("objectClass", HashSet::from(["inetOrgPerson"])),
Mod::Delete("sn", HashSet::from(["Nejgebauer"])),
Mod::Delete("cn", HashSet::from(["Ivan Nejgebauer"])),
Mod::Add("objectClass", HashSet::from(["account"])),
],
1 => vec![
Mod::Delete("objectClass", HashSet::from(["account"])),
Mod::Add("objectClass", HashSet::from(["inetOrgPerson"])),
Mod::Add("sn", HashSet::from(["Nejgebauer"])),
Mod::Add("cn", HashSet::from(["Ivan Nejgebauer"])),
],
_ => panic!("unexpected result count"),
};
let res = ldap
.with_controls(RelaxRules.critical())
.modify("uid=inejge,ou=People,dc=example,dc=org", mod_vec)?
.success()?;
println!("{:?}", res);
Ok(ldap.unbind()?)
}