cal_core/
shared.rs

1use std::fmt::{Debug, Formatter};
2use bson::DateTime;
3use serde::{Deserialize, Deserializer, Serialize};
4use serde_json::Value;
5
6#[derive(Serialize, Deserialize, Clone)]
7#[serde(rename_all = "camelCase")]
8pub struct RecordReference {
9    #[serde(deserialize_with = "object_id_as_string", rename = "_id")]
10    id: String,
11    name: String,
12}
13
14pub fn from_str<'de, D>(deserializer: D) -> Result<u16, D::Error>
15where
16    D: Deserializer<'de>,
17{
18    let value = Value::deserialize(deserializer)?;
19    if value.is_string() {
20        Ok(value.as_str().unwrap().parse().unwrap())
21    } else if value.is_u64() {
22        Ok(value.as_u64().unwrap() as u16)
23    } else if value.is_i64() {
24        Ok(value.as_i64().unwrap() as u16)
25    } else {
26        Err(serde::de::Error::custom("Cannot map extension to u16"))
27    }
28}
29
30pub fn object_id_as_string<'de, D>(deserializer: D) -> Result<String, D::Error>
31where
32    D: Deserializer<'de>,
33{
34    let value = Value::deserialize(deserializer)?;
35    if value.is_string() {
36        Ok(value.as_str().unwrap().to_string())
37    } else {
38        match value.get("$oid") {
39            Some(v) => Ok(v.as_str().unwrap().to_string()),
40            None => Err(serde::de::Error::custom("Oid is required")),
41        }
42    }
43}
44
45pub fn build_timestamp() -> DateTime {
46    DateTime::now()
47}
48
49pub fn build_id() -> String {
50    bson::uuid::Uuid::new().to_string()
51}
52
53impl Debug for RecordReference {
54    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
55        f.debug_struct("RecordReference")
56            .field("id", &self.id)
57            .field("name", &self.name)
58            .finish_non_exhaustive()
59    }
60}