cal_core/
auth.rs

1// Filename cal-core/src/auth.rs
2
3use 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}