use serde::{Deserialize, Serialize};
use super::{Extra, de};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Subject {
#[serde(
rename = "_id",
default,
skip_serializing_if = "Option::is_none",
with = "de::text"
)]
pub id: Option<String>,
#[serde(default)]
pub name: String,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub roles: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none", with = "de::text")]
pub notes: Option<String>,
#[serde(rename = "accessToken", default, skip_serializing)]
pub access_token: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
impl Subject {
#[must_use]
pub fn new<I, S>(name: impl Into<String>, roles: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
Self {
name: name.into(),
roles: roles.into_iter().map(Into::into).collect(),
..Self::default()
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Role {
#[serde(
rename = "_id",
default,
skip_serializing_if = "Option::is_none",
with = "de::text"
)]
pub id: Option<String>,
#[serde(default)]
pub name: String,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub permissions: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none", with = "de::text")]
pub notes: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
impl Role {
#[must_use]
pub fn new<I, S>(name: impl Into<String>, permissions: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<String>,
{
Self {
name: name.into(),
permissions: permissions.into_iter().map(Into::into).collect(),
..Self::default()
}
}
}