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