1#[allow(unused_imports)]
9use alloc::collections::BTreeMap;
10
11#[allow(unused_imports)]
12use core::marker::PhantomData;
13use jacquard_common::CowStr;
14use jacquard_common::types::string::{Did, Cid};
15use jacquard_derive::{IntoStatic, lexicon, open_union};
16use serde::{Serialize, Deserialize};
17use crate::com_atproto::admin::RepoRef;
18use crate::com_atproto::repo::strong_ref::StrongRef;
19use crate::tools_ozone::moderation::AccountEvent;
20use crate::tools_ozone::moderation::AgeAssuranceEvent;
21use crate::tools_ozone::moderation::AgeAssuranceOverrideEvent;
22use crate::tools_ozone::moderation::AgeAssurancePurgeEvent;
23use crate::tools_ozone::moderation::CancelScheduledTakedownEvent;
24use crate::tools_ozone::moderation::IdentityEvent;
25use crate::tools_ozone::moderation::ModEventAcknowledge;
26use crate::tools_ozone::moderation::ModEventComment;
27use crate::tools_ozone::moderation::ModEventDivert;
28use crate::tools_ozone::moderation::ModEventEmail;
29use crate::tools_ozone::moderation::ModEventEscalate;
30use crate::tools_ozone::moderation::ModEventLabel;
31use crate::tools_ozone::moderation::ModEventMute;
32use crate::tools_ozone::moderation::ModEventMuteReporter;
33use crate::tools_ozone::moderation::ModEventPriorityScore;
34use crate::tools_ozone::moderation::ModEventReport;
35use crate::tools_ozone::moderation::ModEventResolveAppeal;
36use crate::tools_ozone::moderation::ModEventReverseTakedown;
37use crate::tools_ozone::moderation::ModEventTag;
38use crate::tools_ozone::moderation::ModEventTakedown;
39use crate::tools_ozone::moderation::ModEventUnmute;
40use crate::tools_ozone::moderation::ModEventUnmuteReporter;
41use crate::tools_ozone::moderation::ModEventView;
42use crate::tools_ozone::moderation::ModTool;
43use crate::tools_ozone::moderation::RecordEvent;
44use crate::tools_ozone::moderation::RevokeAccountCredentialsEvent;
45use crate::tools_ozone::moderation::ScheduleTakedownEvent;
46
47#[lexicon]
48#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
49#[serde(rename_all = "camelCase")]
50pub struct EmitEvent<'a> {
51 #[serde(borrow)]
52 pub created_by: Did<'a>,
53 #[serde(borrow)]
54 pub event: EmitEventEvent<'a>,
55 #[serde(skip_serializing_if = "Option::is_none")]
57 #[serde(borrow)]
58 pub external_id: Option<CowStr<'a>>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 #[serde(borrow)]
61 pub mod_tool: Option<ModTool<'a>>,
62 #[serde(borrow)]
63 pub subject: EmitEventSubject<'a>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 #[serde(borrow)]
66 pub subject_blob_cids: Option<Vec<Cid<'a>>>,
67}
68
69
70#[open_union]
71#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
72#[serde(tag = "$type", bound(deserialize = "'de: 'a"))]
73pub enum EmitEventEvent<'a> {
74 #[serde(rename = "tools.ozone.moderation.defs#modEventTakedown")]
75 ModEventTakedown(Box<ModEventTakedown<'a>>),
76 #[serde(rename = "tools.ozone.moderation.defs#modEventAcknowledge")]
77 ModEventAcknowledge(Box<ModEventAcknowledge<'a>>),
78 #[serde(rename = "tools.ozone.moderation.defs#modEventEscalate")]
79 ModEventEscalate(Box<ModEventEscalate<'a>>),
80 #[serde(rename = "tools.ozone.moderation.defs#modEventComment")]
81 ModEventComment(Box<ModEventComment<'a>>),
82 #[serde(rename = "tools.ozone.moderation.defs#modEventLabel")]
83 ModEventLabel(Box<ModEventLabel<'a>>),
84 #[serde(rename = "tools.ozone.moderation.defs#modEventReport")]
85 ModEventReport(Box<ModEventReport<'a>>),
86 #[serde(rename = "tools.ozone.moderation.defs#modEventMute")]
87 ModEventMute(Box<ModEventMute<'a>>),
88 #[serde(rename = "tools.ozone.moderation.defs#modEventUnmute")]
89 ModEventUnmute(Box<ModEventUnmute<'a>>),
90 #[serde(rename = "tools.ozone.moderation.defs#modEventMuteReporter")]
91 ModEventMuteReporter(Box<ModEventMuteReporter<'a>>),
92 #[serde(rename = "tools.ozone.moderation.defs#modEventUnmuteReporter")]
93 ModEventUnmuteReporter(Box<ModEventUnmuteReporter<'a>>),
94 #[serde(rename = "tools.ozone.moderation.defs#modEventReverseTakedown")]
95 ModEventReverseTakedown(Box<ModEventReverseTakedown<'a>>),
96 #[serde(rename = "tools.ozone.moderation.defs#modEventResolveAppeal")]
97 ModEventResolveAppeal(Box<ModEventResolveAppeal<'a>>),
98 #[serde(rename = "tools.ozone.moderation.defs#modEventEmail")]
99 ModEventEmail(Box<ModEventEmail<'a>>),
100 #[serde(rename = "tools.ozone.moderation.defs#modEventDivert")]
101 ModEventDivert(Box<ModEventDivert<'a>>),
102 #[serde(rename = "tools.ozone.moderation.defs#modEventTag")]
103 ModEventTag(Box<ModEventTag<'a>>),
104 #[serde(rename = "tools.ozone.moderation.defs#accountEvent")]
105 AccountEvent(Box<AccountEvent<'a>>),
106 #[serde(rename = "tools.ozone.moderation.defs#identityEvent")]
107 IdentityEvent(Box<IdentityEvent<'a>>),
108 #[serde(rename = "tools.ozone.moderation.defs#recordEvent")]
109 RecordEvent(Box<RecordEvent<'a>>),
110 #[serde(rename = "tools.ozone.moderation.defs#modEventPriorityScore")]
111 ModEventPriorityScore(Box<ModEventPriorityScore<'a>>),
112 #[serde(rename = "tools.ozone.moderation.defs#ageAssuranceEvent")]
113 AgeAssuranceEvent(Box<AgeAssuranceEvent<'a>>),
114 #[serde(rename = "tools.ozone.moderation.defs#ageAssuranceOverrideEvent")]
115 AgeAssuranceOverrideEvent(Box<AgeAssuranceOverrideEvent<'a>>),
116 #[serde(rename = "tools.ozone.moderation.defs#ageAssurancePurgeEvent")]
117 AgeAssurancePurgeEvent(Box<AgeAssurancePurgeEvent<'a>>),
118 #[serde(rename = "tools.ozone.moderation.defs#revokeAccountCredentialsEvent")]
119 RevokeAccountCredentialsEvent(Box<RevokeAccountCredentialsEvent<'a>>),
120 #[serde(rename = "tools.ozone.moderation.defs#scheduleTakedownEvent")]
121 ScheduleTakedownEvent(Box<ScheduleTakedownEvent<'a>>),
122 #[serde(rename = "tools.ozone.moderation.defs#cancelScheduledTakedownEvent")]
123 CancelScheduledTakedownEvent(Box<CancelScheduledTakedownEvent<'a>>),
124}
125
126
127#[open_union]
128#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
129#[serde(tag = "$type", bound(deserialize = "'de: 'a"))]
130pub enum EmitEventSubject<'a> {
131 #[serde(rename = "com.atproto.admin.defs#repoRef")]
132 RepoRef(Box<RepoRef<'a>>),
133 #[serde(rename = "com.atproto.repo.strongRef")]
134 StrongRef(Box<StrongRef<'a>>),
135}
136
137
138#[lexicon]
139#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, IntoStatic)]
140#[serde(rename_all = "camelCase")]
141pub struct EmitEventOutput<'a> {
142 #[serde(flatten)]
143 #[serde(borrow)]
144 pub value: ModEventView<'a>,
145}
146
147
148#[open_union]
149#[derive(
150 Serialize,
151 Deserialize,
152 Debug,
153 Clone,
154 PartialEq,
155 Eq,
156 thiserror::Error,
157 miette::Diagnostic,
158 IntoStatic
159)]
160
161#[serde(tag = "error", content = "message")]
162#[serde(bound(deserialize = "'de: 'a"))]
163pub enum EmitEventError<'a> {
164 #[serde(rename = "SubjectHasAction")]
165 SubjectHasAction(Option<CowStr<'a>>),
166 #[serde(rename = "DuplicateExternalId")]
168 DuplicateExternalId(Option<CowStr<'a>>),
169}
170
171impl core::fmt::Display for EmitEventError<'_> {
172 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
173 match self {
174 Self::SubjectHasAction(msg) => {
175 write!(f, "SubjectHasAction")?;
176 if let Some(msg) = msg {
177 write!(f, ": {}", msg)?;
178 }
179 Ok(())
180 }
181 Self::DuplicateExternalId(msg) => {
182 write!(f, "DuplicateExternalId")?;
183 if let Some(msg) = msg {
184 write!(f, ": {}", msg)?;
185 }
186 Ok(())
187 }
188 Self::Unknown(err) => write!(f, "Unknown error: {:?}", err),
189 }
190 }
191}
192
193pub struct EmitEventResponse;
195impl jacquard_common::xrpc::XrpcResp for EmitEventResponse {
196 const NSID: &'static str = "tools.ozone.moderation.emitEvent";
197 const ENCODING: &'static str = "application/json";
198 type Output<'de> = EmitEventOutput<'de>;
199 type Err<'de> = EmitEventError<'de>;
200}
201
202impl<'a> jacquard_common::xrpc::XrpcRequest for EmitEvent<'a> {
203 const NSID: &'static str = "tools.ozone.moderation.emitEvent";
204 const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Procedure(
205 "application/json",
206 );
207 type Response = EmitEventResponse;
208}
209
210pub struct EmitEventRequest;
212impl jacquard_common::xrpc::XrpcEndpoint for EmitEventRequest {
213 const PATH: &'static str = "/xrpc/tools.ozone.moderation.emitEvent";
214 const METHOD: jacquard_common::xrpc::XrpcMethod = jacquard_common::xrpc::XrpcMethod::Procedure(
215 "application/json",
216 );
217 type Request<'de> = EmitEvent<'de>;
218 type Response = EmitEventResponse;
219}
220
221pub mod emit_event_state {
222
223 pub use crate::builder_types::{Set, Unset, IsSet, IsUnset};
224 #[allow(unused)]
225 use ::core::marker::PhantomData;
226 mod sealed {
227 pub trait Sealed {}
228 }
229 pub trait State: sealed::Sealed {
231 type Subject;
232 type Event;
233 type CreatedBy;
234 }
235 pub struct Empty(());
237 impl sealed::Sealed for Empty {}
238 impl State for Empty {
239 type Subject = Unset;
240 type Event = Unset;
241 type CreatedBy = Unset;
242 }
243 pub struct SetSubject<S: State = Empty>(PhantomData<fn() -> S>);
245 impl<S: State> sealed::Sealed for SetSubject<S> {}
246 impl<S: State> State for SetSubject<S> {
247 type Subject = Set<members::subject>;
248 type Event = S::Event;
249 type CreatedBy = S::CreatedBy;
250 }
251 pub struct SetEvent<S: State = Empty>(PhantomData<fn() -> S>);
253 impl<S: State> sealed::Sealed for SetEvent<S> {}
254 impl<S: State> State for SetEvent<S> {
255 type Subject = S::Subject;
256 type Event = Set<members::event>;
257 type CreatedBy = S::CreatedBy;
258 }
259 pub struct SetCreatedBy<S: State = Empty>(PhantomData<fn() -> S>);
261 impl<S: State> sealed::Sealed for SetCreatedBy<S> {}
262 impl<S: State> State for SetCreatedBy<S> {
263 type Subject = S::Subject;
264 type Event = S::Event;
265 type CreatedBy = Set<members::created_by>;
266 }
267 #[allow(non_camel_case_types)]
269 pub mod members {
270 pub struct subject(());
272 pub struct event(());
274 pub struct created_by(());
276 }
277}
278
279pub struct EmitEventBuilder<'a, S: emit_event_state::State> {
281 _state: PhantomData<fn() -> S>,
282 _fields: (
283 Option<Did<'a>>,
284 Option<EmitEventEvent<'a>>,
285 Option<CowStr<'a>>,
286 Option<ModTool<'a>>,
287 Option<EmitEventSubject<'a>>,
288 Option<Vec<Cid<'a>>>,
289 ),
290 _lifetime: PhantomData<&'a ()>,
291}
292
293impl<'a> EmitEvent<'a> {
294 pub fn new() -> EmitEventBuilder<'a, emit_event_state::Empty> {
296 EmitEventBuilder::new()
297 }
298}
299
300impl<'a> EmitEventBuilder<'a, emit_event_state::Empty> {
301 pub fn new() -> Self {
303 EmitEventBuilder {
304 _state: PhantomData,
305 _fields: (None, None, None, None, None, None),
306 _lifetime: PhantomData,
307 }
308 }
309}
310
311impl<'a, S> EmitEventBuilder<'a, S>
312where
313 S: emit_event_state::State,
314 S::CreatedBy: emit_event_state::IsUnset,
315{
316 pub fn created_by(
318 mut self,
319 value: impl Into<Did<'a>>,
320 ) -> EmitEventBuilder<'a, emit_event_state::SetCreatedBy<S>> {
321 self._fields.0 = Option::Some(value.into());
322 EmitEventBuilder {
323 _state: PhantomData,
324 _fields: self._fields,
325 _lifetime: PhantomData,
326 }
327 }
328}
329
330impl<'a, S> EmitEventBuilder<'a, S>
331where
332 S: emit_event_state::State,
333 S::Event: emit_event_state::IsUnset,
334{
335 pub fn event(
337 mut self,
338 value: impl Into<EmitEventEvent<'a>>,
339 ) -> EmitEventBuilder<'a, emit_event_state::SetEvent<S>> {
340 self._fields.1 = Option::Some(value.into());
341 EmitEventBuilder {
342 _state: PhantomData,
343 _fields: self._fields,
344 _lifetime: PhantomData,
345 }
346 }
347}
348
349impl<'a, S: emit_event_state::State> EmitEventBuilder<'a, S> {
350 pub fn external_id(mut self, value: impl Into<Option<CowStr<'a>>>) -> Self {
352 self._fields.2 = value.into();
353 self
354 }
355 pub fn maybe_external_id(mut self, value: Option<CowStr<'a>>) -> Self {
357 self._fields.2 = value;
358 self
359 }
360}
361
362impl<'a, S: emit_event_state::State> EmitEventBuilder<'a, S> {
363 pub fn mod_tool(mut self, value: impl Into<Option<ModTool<'a>>>) -> Self {
365 self._fields.3 = value.into();
366 self
367 }
368 pub fn maybe_mod_tool(mut self, value: Option<ModTool<'a>>) -> Self {
370 self._fields.3 = value;
371 self
372 }
373}
374
375impl<'a, S> EmitEventBuilder<'a, S>
376where
377 S: emit_event_state::State,
378 S::Subject: emit_event_state::IsUnset,
379{
380 pub fn subject(
382 mut self,
383 value: impl Into<EmitEventSubject<'a>>,
384 ) -> EmitEventBuilder<'a, emit_event_state::SetSubject<S>> {
385 self._fields.4 = Option::Some(value.into());
386 EmitEventBuilder {
387 _state: PhantomData,
388 _fields: self._fields,
389 _lifetime: PhantomData,
390 }
391 }
392}
393
394impl<'a, S: emit_event_state::State> EmitEventBuilder<'a, S> {
395 pub fn subject_blob_cids(mut self, value: impl Into<Option<Vec<Cid<'a>>>>) -> Self {
397 self._fields.5 = value.into();
398 self
399 }
400 pub fn maybe_subject_blob_cids(mut self, value: Option<Vec<Cid<'a>>>) -> Self {
402 self._fields.5 = value;
403 self
404 }
405}
406
407impl<'a, S> EmitEventBuilder<'a, S>
408where
409 S: emit_event_state::State,
410 S::Subject: emit_event_state::IsSet,
411 S::Event: emit_event_state::IsSet,
412 S::CreatedBy: emit_event_state::IsSet,
413{
414 pub fn build(self) -> EmitEvent<'a> {
416 EmitEvent {
417 created_by: self._fields.0.unwrap(),
418 event: self._fields.1.unwrap(),
419 external_id: self._fields.2,
420 mod_tool: self._fields.3,
421 subject: self._fields.4.unwrap(),
422 subject_blob_cids: self._fields.5,
423 extra_data: Default::default(),
424 }
425 }
426 pub fn build_with_data(
428 self,
429 extra_data: BTreeMap<
430 jacquard_common::deps::smol_str::SmolStr,
431 jacquard_common::types::value::Data<'a>,
432 >,
433 ) -> EmitEvent<'a> {
434 EmitEvent {
435 created_by: self._fields.0.unwrap(),
436 event: self._fields.1.unwrap(),
437 external_id: self._fields.2,
438 mod_tool: self._fields.3,
439 subject: self._fields.4.unwrap(),
440 subject_blob_cids: self._fields.5,
441 extra_data: Some(extra_data),
442 }
443 }
444}