1use crate::messaging::{ConversationAudience, ExternalActor, MessagingAddress};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6#[serde(rename_all = "lowercase")]
7pub enum Placement {
8 Local,
9 Cloud,
10}
11
12impl Placement {
13 #[must_use]
14 pub const fn as_str(self) -> &'static str {
15 match self {
16 Self::Local => "local",
17 Self::Cloud => "cloud",
18 }
19 }
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase", deny_unknown_fields)]
24pub struct FrontendProvider {
25 pub provider: String,
26 pub deprecated: bool,
27 pub supported_placements: Vec<Placement>,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase", deny_unknown_fields)]
32pub struct ProviderListRequest {
33 pub placement: Placement,
34 pub frontend_providers: Vec<FrontendProvider>,
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(rename_all = "camelCase", deny_unknown_fields)]
39pub struct ProviderMetadata {
40 pub provider: String,
41 pub display_name: String,
42 pub placement: Placement,
43 pub deprecated: bool,
44 pub available: bool,
45 #[serde(default, skip_serializing_if = "Option::is_none")]
46 pub disabled_reason: Option<String>,
47 pub setup_flow: String,
48 pub audiences: Vec<ConversationAudience>,
49 pub inbound_capabilities: Vec<ContentCapability>,
50 pub outbound_capabilities: Vec<ContentCapability>,
51 pub delivery_mode: DeliveryMode,
52 pub projections: ProjectionCapabilities,
53 pub management_operations: Vec<ManagementOperation>,
54 pub provider_data: Value,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
58#[serde(rename_all = "camelCase", deny_unknown_fields)]
59pub struct ProjectionCapabilities {
60 pub notification: ProjectionCapability,
61 pub dialog: ProjectionCapability,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase", deny_unknown_fields)]
66pub struct ProjectionCapability {
67 pub supported: bool,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
69 pub reason: Option<ProjectionUnsupportedReason>,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
73#[serde(rename_all = "snake_case")]
74pub enum ProjectionUnsupportedReason {
75 NoProactiveDelivery,
76 NoInteractiveActions,
77 SessionWindowOnly,
78 ProviderUnconfigured,
79}
80
81#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
82#[serde(rename_all = "camelCase", deny_unknown_fields)]
83pub struct RouteProjectionSettings {
84 pub notification: NotificationProjectionSetting,
85 pub dialog: DialogProjectionSetting,
86}
87
88#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase", deny_unknown_fields)]
90pub struct NotificationProjectionSetting {
91 pub enabled: bool,
92 pub levels: Vec<NotificationProjectionLevel>,
93}
94
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
96#[serde(rename_all = "snake_case")]
97pub enum NotificationProjectionLevel {
98 Alert,
99 Notify,
100 Chat,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104#[serde(rename_all = "camelCase", deny_unknown_fields)]
105pub struct DialogProjectionSetting {
106 pub enabled: bool,
107}
108
109#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
110#[serde(rename_all = "camelCase", deny_unknown_fields)]
111pub struct RouteProjectionSettingsUpdate {
112 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub notification: Option<NotificationProjectionSettingUpdate>,
114 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub dialog: Option<DialogProjectionSettingUpdate>,
116}
117
118#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
119#[serde(rename_all = "camelCase", deny_unknown_fields)]
120pub struct NotificationProjectionSettingUpdate {
121 #[serde(default, skip_serializing_if = "Option::is_none")]
122 pub enabled: Option<bool>,
123 #[serde(default, skip_serializing_if = "Option::is_none")]
124 pub levels: Option<Vec<NotificationProjectionLevel>>,
125}
126
127#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
128#[serde(rename_all = "camelCase", deny_unknown_fields)]
129pub struct DialogProjectionSettingUpdate {
130 #[serde(default, skip_serializing_if = "Option::is_none")]
131 pub enabled: Option<bool>,
132}
133
134#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
135#[serde(rename_all = "snake_case")]
136pub enum ContentCapability {
137 Text,
138 Markdown,
139 Image,
140 Audio,
141 Video,
142 File,
143 Action,
144}
145
146#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
147#[serde(rename_all = "snake_case")]
148pub enum DeliveryMode {
149 Unrestricted,
150 SessionWindow,
151}
152
153#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
154pub enum ManagementOperation {
155 #[serde(rename = "provider_account.list")]
156 ProviderAccountList,
157 #[serde(rename = "provider_account.update")]
158 ProviderAccountUpdate,
159 #[serde(rename = "provider_account.delete")]
160 ProviderAccountDelete,
161 #[serde(rename = "provider_account.test")]
162 ProviderAccountTest,
163 #[serde(rename = "provider_account.status")]
164 ProviderAccountStatus,
165 #[serde(rename = "shared_account_grant.create")]
166 SharedAccountGrantCreate,
167 #[serde(rename = "shared_account_grant.delete")]
168 SharedAccountGrantDelete,
169 #[serde(rename = "shared_account_grant.list")]
170 SharedAccountGrantList,
171 #[serde(rename = "route.list")]
172 RouteList,
173 #[serde(rename = "route.update")]
174 RouteUpdate,
175 #[serde(rename = "route.delete")]
176 RouteDelete,
177 #[serde(rename = "setup.options")]
178 SetupOptions,
179 #[serde(rename = "setup.start")]
180 SetupStart,
181 #[serde(rename = "setup.status")]
182 SetupStatus,
183 #[serde(rename = "surface.list")]
184 SurfaceList,
185 #[serde(rename = "surface.dismiss")]
186 SurfaceDismiss,
187 #[serde(rename = "surface.bind_code.create")]
188 SurfaceBindCodeCreate,
189 #[serde(rename = "actor.link_code.create")]
190 ActorLinkCodeCreate,
191 #[serde(rename = "actor.link_claim.status")]
192 ActorLinkClaimStatus,
193 #[serde(rename = "actor.link_claim.confirm")]
194 ActorLinkClaimConfirm,
195 #[serde(rename = "actor.link.list")]
196 ActorLinkList,
197 #[serde(rename = "actor.link.delete")]
198 ActorLinkDelete,
199}
200
201#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
202#[serde(rename_all = "camelCase", deny_unknown_fields)]
203pub struct ProviderListResponse {
204 pub providers: Vec<ProviderMetadata>,
205}
206
207#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase", deny_unknown_fields)]
209pub struct ProviderPlacementRequest {
210 pub provider: String,
211 pub placement: Placement,
212}
213
214#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
215#[serde(rename_all = "camelCase", deny_unknown_fields)]
216pub struct ProviderAccountUpdateRequest {
217 pub provider: String,
218 pub placement: Placement,
219 pub account_id: String,
220 pub data: Value,
221}
222
223#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
224#[serde(rename_all = "camelCase", deny_unknown_fields)]
225pub struct ProviderAccountRequest {
226 pub provider: String,
227 pub placement: Placement,
228 pub account_id: String,
229}
230
231#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase", deny_unknown_fields)]
233pub struct ProviderAccountTestRequest {
234 pub provider: String,
235 pub placement: Placement,
236 pub data: Value,
237}
238
239#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
240#[serde(rename_all = "snake_case")]
241pub enum ProviderAccountOwnership {
242 System,
243 User,
244}
245
246#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
247#[serde(rename_all = "camelCase", deny_unknown_fields)]
248pub struct ProviderAccount {
249 pub provider: String,
250 pub placement: Placement,
251 pub account_id: String,
252 pub ownership: ProviderAccountOwnership,
253 #[serde(default, skip_serializing_if = "Option::is_none")]
254 pub display_name: Option<String>,
255 pub enabled: bool,
256 pub status: String,
257 #[serde(default, skip_serializing_if = "Option::is_none")]
258 pub status_message: Option<String>,
259 pub provider_data: Value,
260}
261
262#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
263#[serde(rename_all = "camelCase", deny_unknown_fields)]
264pub struct ProviderAccountListResponse {
265 pub accounts: Vec<ProviderAccount>,
266}
267
268#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase", deny_unknown_fields)]
270pub struct ProviderAccountUpdateResponse {
271 pub account: ProviderAccount,
272}
273
274#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
275#[serde(rename_all = "camelCase", deny_unknown_fields)]
276pub struct ProviderAccountTestResponse {
277 pub result: Value,
278}
279
280#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
281#[serde(rename_all = "camelCase", deny_unknown_fields)]
282pub struct ProviderStatus {
283 pub provider: String,
284 pub placement: Placement,
285 pub enabled: bool,
286 pub provider_data: Value,
287}
288
289#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
290#[serde(rename_all = "camelCase", deny_unknown_fields)]
291pub struct ProviderAccountStatusResponse {
292 pub status: ProviderStatus,
293}
294
295#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
296#[serde(rename_all = "camelCase", deny_unknown_fields)]
297pub struct MutationResponse {
298 pub success: bool,
299}
300
301#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
302#[serde(rename_all = "camelCase", deny_unknown_fields)]
303pub struct SharedAccountGrantRequest {
304 pub provider: String,
305 pub placement: Placement,
306 pub account_id: String,
307}
308
309#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
310#[serde(rename_all = "camelCase", deny_unknown_fields)]
311pub struct SharedAccountGrantListRequest {
312 pub provider: String,
313 pub placement: Placement,
314 #[serde(default, skip_serializing_if = "Option::is_none")]
315 pub account_id: Option<String>,
316}
317
318#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
319#[serde(rename_all = "camelCase", deny_unknown_fields)]
320pub struct SharedAccountGrant {
321 pub provider: String,
322 pub placement: Placement,
323 pub account_id: String,
324 pub tenant_id: String,
325 pub scope_id: String,
326 pub granted_by_user_id: String,
327 pub created_at_ms: i64,
328 pub updated_at_ms: i64,
329}
330
331#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
332#[serde(rename_all = "camelCase", deny_unknown_fields)]
333pub struct SharedAccountGrantListResponse {
334 pub grants: Vec<SharedAccountGrant>,
335}
336
337#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
338#[serde(rename_all = "camelCase", deny_unknown_fields)]
339pub struct RouteListRequest {
340 pub provider: String,
341 pub placement: Placement,
342 #[serde(default, skip_serializing_if = "Option::is_none")]
343 pub account_id: Option<String>,
344 #[serde(default, skip_serializing_if = "Option::is_none")]
345 pub audience: Option<ConversationAudience>,
346}
347
348#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
349#[serde(rename_all = "camelCase", deny_unknown_fields)]
350pub struct RouteRequest {
351 pub provider: String,
352 pub placement: Placement,
353 pub route_id: String,
354}
355
356#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
357#[serde(
358 tag = "audience",
359 rename_all = "lowercase",
360 rename_all_fields = "camelCase",
361 deny_unknown_fields
362)]
363pub enum RouteUpdateRequest {
364 Personal {
365 provider: String,
366 placement: Placement,
367 route_id: String,
368 #[serde(default, skip_serializing_if = "Option::is_none")]
369 scope_id: Option<String>,
370 #[serde(default, skip_serializing_if = "Option::is_none")]
371 enabled: Option<bool>,
372 #[serde(default, skip_serializing_if = "Option::is_none")]
373 projections: Option<RouteProjectionSettingsUpdate>,
374 },
375 Shared {
376 provider: String,
377 placement: Placement,
378 route_id: String,
379 #[serde(default, skip_serializing_if = "Option::is_none")]
380 enabled: Option<bool>,
381 #[serde(default, skip_serializing_if = "Option::is_none")]
382 projections: Option<RouteProjectionSettingsUpdate>,
383 },
384}
385
386#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
387#[serde(
388 tag = "audience",
389 rename_all = "lowercase",
390 rename_all_fields = "camelCase",
391 deny_unknown_fields
392)]
393pub enum MessagingRoute {
394 Personal {
395 provider: String,
396 placement: Placement,
397 route_id: String,
398 account_id: String,
399 conversation_id: String,
400 external_actor_id: String,
401 tenant_id: String,
402 user_id: String,
403 scope_id: String,
404 #[serde(default, skip_serializing_if = "Option::is_none")]
405 display_name: Option<String>,
406 enabled: bool,
407 projections: RouteProjectionSettings,
408 provider_data: Value,
409 },
410 Shared {
411 provider: String,
412 placement: Placement,
413 route_id: String,
414 account_id: String,
415 conversation_id: String,
416 tenant_id: String,
417 scope_id: String,
418 bound_by_user_id: String,
419 #[serde(default, skip_serializing_if = "Option::is_none")]
420 display_name: Option<String>,
421 enabled: bool,
422 projections: RouteProjectionSettings,
423 provider_data: Value,
424 },
425}
426
427#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
428#[serde(rename_all = "camelCase", deny_unknown_fields)]
429pub struct RouteListResponse {
430 pub routes: Vec<MessagingRoute>,
431}
432
433#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
434#[serde(rename_all = "camelCase", deny_unknown_fields)]
435pub struct RouteUpdateResponse {
436 pub route: MessagingRoute,
437}
438
439#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
440#[serde(rename_all = "camelCase", deny_unknown_fields)]
441pub struct SetupStartRequest {
442 pub provider: String,
443 pub placement: Placement,
444 pub data: Value,
445}
446
447#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
448#[serde(rename_all = "camelCase", deny_unknown_fields)]
449pub struct SetupOptionsResponse {
450 pub options: Value,
451}
452
453#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
454#[serde(rename_all = "camelCase", deny_unknown_fields)]
455pub struct SetupStatusRequest {
456 pub provider: String,
457 pub placement: Placement,
458 pub setup_id: String,
459}
460
461#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
462#[serde(rename_all = "camelCase", deny_unknown_fields)]
463pub struct SetupAction {
464 #[serde(rename = "type")]
465 pub kind: String,
466 #[serde(default, skip_serializing_if = "Option::is_none")]
467 pub url: Option<String>,
468}
469
470#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
471#[serde(rename_all = "camelCase", deny_unknown_fields)]
472pub struct SetupState {
473 #[serde(default, skip_serializing_if = "Option::is_none")]
474 pub setup_id: Option<String>,
475 pub status: String,
476 #[serde(default, skip_serializing_if = "Option::is_none")]
477 pub expires_at_ms: Option<i64>,
478 #[serde(default, skip_serializing_if = "Option::is_none")]
479 pub action: Option<SetupAction>,
480 pub provider_data: Value,
481 #[serde(default, skip_serializing_if = "Option::is_none")]
482 pub account_id: Option<String>,
483 #[serde(default, skip_serializing_if = "Option::is_none")]
484 pub route_id: Option<String>,
485 #[serde(default, skip_serializing_if = "Option::is_none")]
486 pub message: Option<String>,
487}
488
489#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
490#[serde(rename_all = "camelCase", deny_unknown_fields)]
491pub struct SetupResponse {
492 pub setup: SetupState,
493}
494
495#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
496#[serde(rename_all = "lowercase")]
497pub enum SurfaceState {
498 Pending,
499 Bound,
500 Dismissed,
501}
502
503#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
504#[serde(rename_all = "camelCase", deny_unknown_fields)]
505pub struct SurfaceListRequest {
506 pub provider: String,
507 pub placement: Placement,
508 #[serde(default, skip_serializing_if = "Option::is_none")]
509 pub account_id: Option<String>,
510 #[serde(default, skip_serializing_if = "Option::is_none")]
511 pub state: Option<SurfaceState>,
512}
513
514#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
515#[serde(rename_all = "camelCase", deny_unknown_fields)]
516pub struct MessagingSurface {
517 pub provider: String,
518 pub placement: Placement,
519 pub account_id: String,
520 pub surface_id: String,
521 #[serde(default, skip_serializing_if = "Option::is_none")]
522 pub display_name: Option<String>,
523 pub state: SurfaceState,
524 #[serde(default, skip_serializing_if = "Option::is_none")]
525 pub scope_id: Option<String>,
526 pub first_seen_at_ms: i64,
527 pub last_seen_at_ms: i64,
528}
529
530#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
531#[serde(rename_all = "camelCase", deny_unknown_fields)]
532pub struct SurfaceListResponse {
533 pub surfaces: Vec<MessagingSurface>,
534}
535
536#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
537#[serde(rename_all = "camelCase", deny_unknown_fields)]
538pub struct SurfaceRequest {
539 pub provider: String,
540 pub placement: Placement,
541 pub surface_id: String,
542}
543
544#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
545#[serde(rename_all = "camelCase", deny_unknown_fields)]
546pub struct SurfaceBindCodeCreateRequest {
547 pub provider: String,
548 pub placement: Placement,
549 pub surface_id: String,
550 pub scope_id: String,
551}
552
553#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
554#[serde(rename_all = "camelCase", deny_unknown_fields)]
555pub struct ActorLinkCodeCreateRequest {
556 pub provider: String,
557 pub placement: Placement,
558 pub account_id: String,
559 pub target: ActorLinkTarget,
560}
561
562#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
563#[serde(
564 tag = "audience",
565 rename_all = "lowercase",
566 rename_all_fields = "camelCase",
567 deny_unknown_fields
568)]
569pub enum ActorLinkTarget {
570 Personal,
571 Shared { surface_id: String },
572}
573
574#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
575#[serde(rename_all = "camelCase", deny_unknown_fields)]
576pub struct ChallengeCode {
577 pub code: String,
578 pub command: String,
579 pub expires_at_ms: i64,
580}
581
582#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
583#[serde(rename_all = "camelCase", deny_unknown_fields)]
584pub struct ActorLinkChallenge {
585 pub challenge_id: String,
586 pub code: String,
587 pub command: String,
588 pub target: ActorLinkTarget,
589 pub expires_at_ms: i64,
590}
591
592#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
593#[serde(rename_all = "camelCase", deny_unknown_fields)]
594pub struct ActorLinkChallengeResponse {
595 pub challenge: ActorLinkChallenge,
596}
597
598#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
599#[serde(rename_all = "camelCase", deny_unknown_fields)]
600pub struct ActorLinkCandidate {
601 pub actor: ExternalActor,
602 pub address: MessagingAddress,
603 pub event_id: String,
604}
605
606#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
607#[serde(rename_all = "camelCase", deny_unknown_fields)]
608pub struct ActorLinkClaim {
609 pub challenge_id: String,
610 pub provider: String,
611 pub placement: Placement,
612 pub account_id: String,
613 pub target: ActorLinkTarget,
614 pub expires_at_ms: i64,
615 pub lifecycle: ActorLinkClaimLifecycle,
616}
617
618#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
619#[serde(
620 tag = "state",
621 rename_all = "snake_case",
622 rename_all_fields = "camelCase",
623 deny_unknown_fields
624)]
625pub enum ActorLinkClaimLifecycle {
626 Issued,
627 AwaitingConfirmation {
628 candidate: ActorLinkCandidate,
629 },
630 Confirming {
631 candidate: ActorLinkCandidate,
632 },
633 Completed {
634 candidate: ActorLinkCandidate,
635 link_id: String,
636 },
637 Superseded,
638 Expired,
639}
640
641#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
642#[serde(rename_all = "camelCase", deny_unknown_fields)]
643pub struct ActorLinkClaimRequest {
644 pub provider: String,
645 pub placement: Placement,
646 pub challenge_id: String,
647}
648
649#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
650#[serde(rename_all = "camelCase", deny_unknown_fields)]
651pub struct ActorLinkClaimResponse {
652 pub claim: ActorLinkClaim,
653}
654
655#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
656#[serde(rename_all = "camelCase", deny_unknown_fields)]
657pub struct ActorLinkClaimEvent {
658 pub claim: ActorLinkClaim,
659}
660
661#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
662#[serde(rename_all = "camelCase", deny_unknown_fields)]
663pub struct ChallengeCodeResponse {
664 pub challenge: ChallengeCode,
665}
666
667#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
668#[serde(rename_all = "camelCase", deny_unknown_fields)]
669pub struct ActorLinkListRequest {
670 pub provider: String,
671 pub placement: Placement,
672 #[serde(default, skip_serializing_if = "Option::is_none")]
673 pub account_id: Option<String>,
674}
675
676#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
677#[serde(rename_all = "camelCase", deny_unknown_fields)]
678pub struct ActorLinkView {
679 pub link_id: String,
680 pub provider: String,
681 pub placement: Placement,
682 pub account_id: String,
683 pub external_user_id: String,
684 #[serde(default, skip_serializing_if = "Option::is_none")]
685 pub display_name: Option<String>,
686 pub created_at_ms: i64,
687 pub updated_at_ms: i64,
688}
689
690#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
691#[serde(rename_all = "camelCase", deny_unknown_fields)]
692pub struct ActorLinkListResponse {
693 pub links: Vec<ActorLinkView>,
694}
695
696#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
697#[serde(rename_all = "camelCase", deny_unknown_fields)]
698pub struct ActorLinkDeleteRequest {
699 pub provider: String,
700 pub placement: Placement,
701 pub link_id: String,
702}