incular_platform/
content_sensitivity.rs1use incular_config::ContentSensitivity;
8
9#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
11pub enum ContentSensitivityCapability {
12 Supported,
14 #[default]
16 Unsupported,
17}
18
19#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
21pub enum ContentSensitivityNoOpReason {
22 Unsupported,
24 Unchanged,
26}
27
28#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
30pub enum ContentSensitivityOutcome {
31 Applied { sensitivity: ContentSensitivity },
33 NoOp {
35 requested: ContentSensitivity,
36 reason: ContentSensitivityNoOpReason,
37 },
38}
39
40impl ContentSensitivityOutcome {
41 #[must_use]
44 pub const fn requested(self) -> ContentSensitivity {
45 match self {
46 Self::Applied { sensitivity } => sensitivity,
47 Self::NoOp { requested, .. } => requested,
48 }
49 }
50
51 #[must_use]
53 pub const fn is_noop(self) -> bool {
54 matches!(self, Self::NoOp { .. })
55 }
56}
57
58pub trait ContentSensitivityBackend {
60 fn capability(&self) -> ContentSensitivityCapability;
62
63 fn apply(&mut self, sensitivity: ContentSensitivity) -> ContentSensitivityOutcome;
66}
67
68#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
72pub struct NoopContentSensitivityBackend;
73
74impl ContentSensitivityBackend for NoopContentSensitivityBackend {
75 fn capability(&self) -> ContentSensitivityCapability {
76 ContentSensitivityCapability::Unsupported
77 }
78
79 fn apply(&mut self, sensitivity: ContentSensitivity) -> ContentSensitivityOutcome {
80 ContentSensitivityOutcome::NoOp {
81 requested: sensitivity,
82 reason: ContentSensitivityNoOpReason::Unsupported,
83 }
84 }
85}
86
87#[derive(Clone, Debug, PartialEq, Eq)]
92pub struct MemoryContentSensitivityBackend {
93 capability: ContentSensitivityCapability,
94 current: ContentSensitivity,
95 outcomes: Vec<ContentSensitivityOutcome>,
96}
97
98impl MemoryContentSensitivityBackend {
99 #[must_use]
102 pub fn new(capability: ContentSensitivityCapability) -> Self {
103 Self {
104 capability,
105 current: ContentSensitivity::NotSensitive,
106 outcomes: Vec::new(),
107 }
108 }
109
110 #[must_use]
112 pub fn supported() -> Self {
113 Self::new(ContentSensitivityCapability::Supported)
114 }
115
116 #[must_use]
118 pub fn unsupported() -> Self {
119 Self::new(ContentSensitivityCapability::Unsupported)
120 }
121
122 #[must_use]
124 pub const fn current(&self) -> ContentSensitivity {
125 self.current
126 }
127
128 #[must_use]
130 pub fn outcomes(&self) -> &[ContentSensitivityOutcome] {
131 &self.outcomes
132 }
133
134 pub fn clear_outcomes(&mut self) {
136 self.outcomes.clear();
137 }
138}
139
140impl Default for MemoryContentSensitivityBackend {
141 fn default() -> Self {
142 Self::supported()
143 }
144}
145
146impl ContentSensitivityBackend for MemoryContentSensitivityBackend {
147 fn capability(&self) -> ContentSensitivityCapability {
148 self.capability
149 }
150
151 fn apply(&mut self, sensitivity: ContentSensitivity) -> ContentSensitivityOutcome {
152 let outcome = match self.capability {
153 ContentSensitivityCapability::Unsupported => ContentSensitivityOutcome::NoOp {
154 requested: sensitivity,
155 reason: ContentSensitivityNoOpReason::Unsupported,
156 },
157 ContentSensitivityCapability::Supported if self.current == sensitivity => {
158 ContentSensitivityOutcome::NoOp {
159 requested: sensitivity,
160 reason: ContentSensitivityNoOpReason::Unchanged,
161 }
162 }
163 ContentSensitivityCapability::Supported => {
164 self.current = sensitivity;
165 ContentSensitivityOutcome::Applied { sensitivity }
166 }
167 };
168 self.outcomes.push(outcome);
169 outcome
170 }
171}