1use std::collections::BTreeSet;
2
3use chrono::{DateTime, Utc};
4use serde::Deserialize;
5
6use crate::{reference::ExternalReference, Id};
7
8#[derive(Deserialize)]
9pub struct CommonProperties {
10 id: Id,
11 created_by_ref: Option<Id>,
12 #[serde(default)]
13 revoked: bool,
14 #[serde(default)]
15 labels: BTreeSet<String>,
16 #[serde(default)]
17 object_marking_refs: BTreeSet<Id>,
18 #[serde(default)]
19 external_references: Vec<ExternalReference>,
20 #[serde(default)]
21 created: Option<DateTime<Utc>>,
22 #[serde(default)]
23 modified: Option<DateTime<Utc>>,
24}
25
26pub trait Object {
28 fn id(&self) -> &Id;
29 fn created_by_ref(&self) -> Option<&Id>;
30 fn revoked(&self) -> bool;
31 fn labels(&self) -> &BTreeSet<String>;
32 fn object_marking_refs(&self) -> &BTreeSet<Id>;
33 fn external_references(&self) -> &[ExternalReference];
34 fn created(&self) -> Option<&DateTime<Utc>>;
35 fn modified(&self) -> Option<&DateTime<Utc>>;
36}
37
38impl Object for CommonProperties {
39 fn id(&self) -> &Id {
40 &self.id
41 }
42
43 fn created_by_ref(&self) -> Option<&Id> {
44 self.created_by_ref.as_ref()
45 }
46
47 fn external_references(&self) -> &[ExternalReference] {
48 &self.external_references
49 }
50
51 fn created(&self) -> Option<&DateTime<Utc>> {
52 self.created.as_ref()
53 }
54
55 fn modified(&self) -> Option<&DateTime<Utc>> {
56 self.modified.as_ref()
57 }
58
59 fn revoked(&self) -> bool {
60 self.revoked
61 }
62
63 fn labels(&self) -> &BTreeSet<String> {
64 &self.labels
65 }
66
67 fn object_marking_refs(&self) -> &BTreeSet<Id> {
68 &self.object_marking_refs
69 }
70}
71
72impl<T: AsRef<CommonProperties>> Object for T {
73 fn id(&self) -> &Id {
74 self.as_ref().id()
75 }
76
77 fn created_by_ref(&self) -> Option<&Id> {
78 self.as_ref().created_by_ref()
79 }
80
81 fn revoked(&self) -> bool {
82 self.as_ref().revoked()
83 }
84
85 fn labels(&self) -> &BTreeSet<String> {
86 self.as_ref().labels()
87 }
88
89 fn object_marking_refs(&self) -> &BTreeSet<Id> {
90 self.as_ref().object_marking_refs()
91 }
92
93 fn external_references(&self) -> &[ExternalReference] {
94 self.as_ref().external_references()
95 }
96
97 fn created(&self) -> Option<&DateTime<Utc>> {
98 self.as_ref().created()
99 }
100
101 fn modified(&self) -> Option<&DateTime<Utc>> {
102 self.as_ref().modified()
103 }
104}
105
106pub trait TypedObject {
110 const TYPE: &'static str;
117}