windows_users 0.2.0

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

#[must_use]
pub struct AutoRemoveUserResult {
    pub _guard: AutoRemoveUser,
    pub added_or_changed: bool,
}

impl AutoRemoveUser {
    fn make_result(
        server_name: Option<&str>,
        user: &User,
        should_remove: bool,
    ) -> AutoRemoveUserResult {
        assert!(
            user.exists(server_name),
            "User should exist after operation"
        );

        AutoRemoveUserResult {
            _guard: AutoRemoveUser {
                server_name: server_name.map(|s| s.into()),
                user: user.clone(),
                should_remove,
            },
            added_or_changed: should_remove,
        }
    }
}

pub struct AutoRemoveUser {
    pub server_name: Option<String>,
    pub user: User,
    should_remove: bool,
}

impl Drop for AutoRemoveUser {
    fn drop(&mut self) {
        if self.should_remove {
            self.user
                .clone()
                .delete(self.server_name.as_deref())
                .unwrap_or_else(|_| panic!("Failed to remove user '{}'", self.user.name()));
        }
    }
}

impl AutoRemoveUser {
    pub fn add(
        server_name: Option<&str>,
        user: &User,
    ) -> Result<AutoRemoveUserResult, WindowsUsersError> {
        user.add(server_name)?;

        Ok(Self::make_result(server_name, user, true))
    }

    pub fn add_if_not_exists(
        server_name: Option<&str>,
        user: &User,
    ) -> Result<AutoRemoveUserResult, WindowsUsersError> {
        let added = user.add_if_not_exists(server_name)?;

        Ok(Self::make_result(server_name, user, added))
    }

    pub fn add_or_update(
        server_name: Option<&str>,
        user: &User,
    ) -> Result<AutoRemoveUserResult, WindowsUsersError> {
        let changed = user.add_or_update(server_name)?;

        Ok(Self::make_result(server_name, user, changed))
    }
}