cal_core/
shared.rs

1use bson::DateTime;
2use serde::{Deserialize, Deserializer, Serialize};
3use serde_json::Value;
4
5#[derive(Serialize, Deserialize, Clone)]
6#[serde(rename_all = "camelCase")]
7pub struct RecordReference {
8    #[serde(deserialize_with = "object_id_as_string", rename = "_id")]
9    id: String,
10    name: String,
11}
12
13pub fn from_str<'de, D>(deserializer: D) -> Result<u16, D::Error>
14where
15    D: Deserializer<'de>,
16{
17    let value = Value::deserialize(deserializer)?;
18    if value.is_string() {
19        Ok(value.as_str().unwrap().parse().unwrap())
20    } else if value.is_u64() {
21        Ok(value.as_u64().unwrap() as u16)
22    } else if value.is_i64() {
23        Ok(value.as_i64().unwrap() as u16)
24    } else {
25        Err(serde::de::Error::custom("Cannot map extension to u16"))
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}
43
44pub fn build_timestamp() -> DateTime {
45    DateTime::now()
46}
47
48pub fn build_id() -> String {
49    bson::uuid::Uuid::new().to_string()
50}