1use crate::RecordReference;
2use serde::{Deserialize, Deserializer, Serialize};
3use serde_json::Value;
4
5#[derive(Serialize, Deserialize, Clone)]
6#[serde(rename_all = "camelCase")]
7pub struct Role {
8 #[serde(deserialize_with = "object_id_as_string", rename = "_id")]
9 pub id:String,
10 pub description:String,
11 pub permissions: Vec<RecordReference>
12}
13
14#[derive(Serialize, Deserialize, Clone)]
15#[serde(rename_all = "camelCase")]
16pub struct Permission {
17 #[serde(deserialize_with = "object_id_as_string", rename = "_id")]
18 pub id:String,
19 pub name:String,
20 pub description:String,
21 #[serde(rename="type")]
22 pub permission_type:String,
23}
24
25
26
27pub fn object_id_as_string<'de, D>(deserializer: D) -> Result<String, D::Error>
28where
29 D: Deserializer<'de>,
30{
31 let value = Value::deserialize(deserializer)?;
32 if value.is_string() {
33 Ok(value.as_str().unwrap().to_string())
34 } else {
35 match value.get("$oid") {
36 Some(v) => Ok(v.as_str().unwrap().to_string()),
37 None => Err(serde::de::Error::custom("Oid is required")),
38 }
39 }
40}