use rs_teststand_sys::{Dispatch, Value};
use crate::Error;
use crate::dispids::user;
use crate::property::PropertyObject;
use crate::users::UserPrivilege;
#[derive(Debug)]
pub struct User {
dispatch: Box<dyn Dispatch>,
}
impl User {
pub(crate) fn new(dispatch: Box<dyn Dispatch>) -> Self {
Self { dispatch }
}
pub fn login_name(&self) -> Result<String, Error> {
Ok(self.dispatch.get(user::LOGIN_NAME)?.into_string()?)
}
pub fn set_login_name(&self, name: &str) -> Result<(), Error> {
self.dispatch
.put(user::LOGIN_NAME, Value::Str(name.to_owned()))?;
Ok(())
}
pub fn full_name(&self) -> Result<String, Error> {
Ok(self.dispatch.get(user::FULL_NAME)?.into_string()?)
}
pub fn set_full_name(&self, name: &str) -> Result<(), Error> {
self.dispatch
.put(user::FULL_NAME, Value::Str(name.to_owned()))?;
Ok(())
}
pub fn set_password(&self, password: &str) -> Result<(), Error> {
self.dispatch
.put(user::PASSWORD, Value::Str(password.to_owned()))?;
Ok(())
}
pub fn password(&self) -> Result<String, Error> {
Ok(self.dispatch.get(user::PASSWORD)?.into_string()?)
}
pub fn validate_password(&self, password: &str) -> Result<bool, Error> {
Ok(self
.dispatch
.call(user::VALIDATE_PASSWORD, &[Value::Str(password.to_owned())])?
.as_bool()?)
}
pub fn has_privilege(&self, privilege: UserPrivilege) -> Result<bool, Error> {
self.has_privilege_named(privilege.name())
}
pub fn has_privilege_named(&self, privilege: &str) -> Result<bool, Error> {
Ok(self
.dispatch
.call(user::HAS_PRIVILEGE, &[Value::Str(privilege.to_owned())])?
.as_bool()?)
}
pub fn privileges(&self) -> Result<PropertyObject, Error> {
Ok(PropertyObject::new(
self.dispatch.get(user::PRIVILEGES)?.into_object()?,
))
}
pub fn members(&self) -> Result<PropertyObject, Error> {
Ok(PropertyObject::new(
self.dispatch.get(user::MEMBERS)?.into_object()?,
))
}
pub fn as_property_object(&self) -> Result<PropertyObject, Error> {
Ok(PropertyObject::new(
self.dispatch
.call(user::AS_PROPERTY_OBJECT, &[])?
.into_object()?,
))
}
pub(crate) fn duplicate_dispatch(&self) -> Option<Box<dyn Dispatch>> {
self.dispatch.duplicate()
}
}