use crate::RecordReference;
use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Role {
#[serde(deserialize_with = "object_id_as_string", rename = "_id")]
pub id:String,
pub description:String,
pub permissions: Vec<RecordReference>
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Permission {
#[serde(deserialize_with = "object_id_as_string", rename = "_id")]
pub id:String,
pub name:String,
pub description:String,
#[serde(rename="type")]
pub permission_type:String,
}
pub fn object_id_as_string<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let value = Value::deserialize(deserializer)?;
if value.is_string() {
Ok(value.as_str().unwrap().to_string())
} else {
match value.get("$oid") {
Some(v) => Ok(v.as_str().unwrap().to_string()),
None => Err(serde::de::Error::custom("Oid is required")),
}
}
}