hwpforge_core/
object_id.rs1use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use std::fmt;
6
7#[derive(
24 Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize, JsonSchema,
25)]
26#[serde(transparent)]
27pub struct ObjectId(u64);
28
29impl ObjectId {
30 pub const fn new(value: u64) -> Self {
32 Self(value)
33 }
34
35 pub const fn value(self) -> u64 {
37 self.0
38 }
39}
40
41impl fmt::Display for ObjectId {
42 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43 write!(f, "{}", self.0)
44 }
45}
46
47impl From<u64> for ObjectId {
48 fn from(value: u64) -> Self {
49 Self(value)
50 }
51}
52
53impl From<ObjectId> for u64 {
54 fn from(id: ObjectId) -> Self {
55 id.0
56 }
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 #[test]
64 fn new_and_value_round_trip() {
65 assert_eq!(ObjectId::new(0).value(), 0);
66 assert_eq!(ObjectId::new(u64::MAX).value(), u64::MAX);
67 assert_eq!(ObjectId::new(1_108_165_575).value(), 1_108_165_575);
68 }
69
70 #[test]
71 fn display_is_bare_integer() {
72 assert_eq!(ObjectId::new(42).to_string(), "42");
73 assert_eq!(ObjectId::new(0).to_string(), "0");
74 }
75
76 #[test]
77 fn from_conversions() {
78 let id: ObjectId = 7u64.into();
79 assert_eq!(id, ObjectId::new(7));
80 let raw: u64 = ObjectId::new(7).into();
81 assert_eq!(raw, 7);
82 }
83
84 #[test]
85 fn serde_is_transparent_bare_integer() {
86 let id = ObjectId::new(40_257_166);
87 let json = serde_json::to_string(&id).unwrap();
88 assert_eq!(json, "40257166");
89 let back: ObjectId = serde_json::from_str(&json).unwrap();
90 assert_eq!(back, id);
91
92 let some: Option<ObjectId> = Some(id);
94 assert_eq!(serde_json::to_string(&some).unwrap(), "40257166");
95 let none: Option<ObjectId> = None;
96 assert_eq!(serde_json::to_string(&none).unwrap(), "null");
97 }
98
99 #[test]
100 fn equality_enables_link_check() {
101 let target = Some(ObjectId::new(123));
103 let referencer = ObjectId::new(123);
104 assert_eq!(target, Some(referencer));
105 }
106}