use toml_edit::
{
Item,
Table,
Value,
};
use crate::
{
consts,
role::Role,
};
fn write_user_field(username: &str, key: &str, value: Value) {
super::with_cached_mut(&super::config_path(consts::SERVER_USERS_CONFIG), |doc|
{
let users = doc.as_table_mut();
if users.get(username).and_then(Item::as_table_like).is_none()
{
users.insert(username, Item::Table(Table::new()));
}
users.get_mut(username).and_then(Item::as_table_like_mut)
.expect("User entry is not a table").insert(key, Item::Value(value));
});
}
pub fn len() -> usize {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).len()
}
pub fn password(username: &str) -> Option<String> {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).get(username)?
.as_table_like()?.get("password")?.as_str().map(str::to_string)
}
pub fn role(username: &str) -> Option<Role> {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).get(username)?
.as_table_like()?.get("role")?.as_str()?.parse().ok()
}
pub fn set_role(username: &str, role: Role) {
write_user_field(username, "role", role.name().into());
}
pub fn add(username: &str, hash: &str) -> bool {
let first_user = len() == 0;
write_user_field(username, "password", hash.into()); set_role(username, if first_user { Role::Owner } else { Role::User });
first_user
}
pub fn contains(key: &str) -> bool {
super::get_data(&super::config_path(consts::SERVER_USERS_CONFIG)).get(key).is_some()
}