stix/
object.rs

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
26/// Common properties for a STIX Domain Object.
27pub 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
106/// A STIX object associated with a specific ID type.
107///
108/// All instances of the struct should have this as their ID.
109pub trait TypedObject {
110    /// The kebab-case type used as the object's ID prefix and in the `type` field
111    /// for declarations of the object.
112    ///
113    /// # Examples
114    /// * `course-of-action`
115    /// * `intrusion-set`
116    const TYPE: &'static str;
117}