use crate::error::{FossilError, Result};
use crate::repo::Repository;
pub struct UsersBuilder<'a> {
repo: &'a Repository,
}
impl<'a> UsersBuilder<'a> {
pub(crate) fn new(repo: &'a Repository) -> Self {
Self { repo }
}
pub fn list(&self) -> Result<Vec<(String, String)>> {
self.repo.list_users_internal()
}
pub fn get(&self, login: &str) -> Result<UserRef<'a>> {
self.repo.get_user_capabilities_internal(login)?;
Ok(UserRef {
repo: self.repo,
login: login.to_string(),
})
}
pub fn create(&self, login: &str) -> UserBuilder<'a> {
UserBuilder {
repo: self.repo,
login: login.to_string(),
password: String::new(),
capabilities: None,
}
}
}
pub struct UserRef<'a> {
repo: &'a Repository,
login: String,
}
impl<'a> UserRef<'a> {
pub fn capabilities(&self) -> Result<Option<String>> {
self.repo.get_user_capabilities_internal(&self.login)
}
pub fn set_capabilities(&self, caps: &str) -> Result<()> {
self.repo.set_user_capabilities_internal(&self.login, caps)
}
pub fn login(&self) -> &str {
&self.login
}
}
pub struct UserBuilder<'a> {
repo: &'a Repository,
login: String,
password: String,
capabilities: Option<String>,
}
impl<'a> UserBuilder<'a> {
pub fn password(mut self, pwd: &str) -> Self {
self.password = pwd.to_string();
self
}
pub fn capabilities(mut self, caps: &str) -> Self {
self.capabilities = Some(caps.to_string());
self
}
pub fn execute(self) -> Result<()> {
let caps = self.capabilities.ok_or_else(|| {
FossilError::InvalidArtifact("user capabilities are required".to_string())
})?;
self.repo
.create_user_internal(&self.login, &self.password, &caps)
}
}