windows_users 0.3.0

A crate for managing Windows local users and groups.
Documentation
use windows_users::{Group, UserManager, WindowsUsersError};

#[must_use]
pub struct AutoRemoveGroupResult<'a> {
    pub _guard: AutoRemoveGroup<'a>,
}

impl<'a> AutoRemoveGroup<'a> {
    fn make_result(
        mgr: &'a UserManager,
        group: &Group,
        should_remove: bool,
    ) -> AutoRemoveGroupResult<'a> {
        assert!(
            mgr.group_exists(group.name()),
            "Group should exist after operation"
        );

        AutoRemoveGroupResult {
            _guard: AutoRemoveGroup {
                mgr,
                group: group.clone(),
                should_remove,
            },
        }
    }
}

pub struct AutoRemoveGroup<'a> {
    mgr: &'a UserManager,
    group: Group,
    should_remove: bool,
}

impl Drop for AutoRemoveGroup<'_> {
    fn drop(&mut self) {
        if self.should_remove {
            self.mgr
                .delete_group(self.group.name())
                .unwrap_or_else(|_| panic!("Failed to remove group '{}'", self.group.name()));
        }
    }
}

impl<'a> AutoRemoveGroup<'a> {
    pub fn add(
        mgr: &'a UserManager,
        group: &Group,
    ) -> Result<AutoRemoveGroupResult<'a>, WindowsUsersError> {
        mgr.create_group(group)?;
        Ok(Self::make_result(mgr, group, true))
    }
}