matrix_sdk/widget/machine/
incoming.rs1use ruma::{
16 api::client::{account::request_openid_token, delayed_events},
17 events::AnyTimelineEvent,
18 serde::Raw,
19};
20use serde::{de, Deserialize, Deserializer};
21use serde_json::value::RawValue as RawJsonValue;
22use uuid::Uuid;
23
24use super::{
25 from_widget::{FromWidgetRequest, SendEventResponse},
26 to_widget::ToWidgetResponse,
27};
28use crate::widget::Capabilities;
29
30pub(crate) enum IncomingMessage {
32 WidgetMessage(String),
34
35 MatrixDriverResponse {
37 request_id: Uuid,
39
40 response: Result<MatrixDriverResponse, crate::Error>,
45 },
46
47 MatrixEventReceived(Raw<AnyTimelineEvent>),
52}
53
54pub(crate) enum MatrixDriverResponse {
55 CapabilitiesAcquired(Capabilities),
59 OpenIdReceived(request_openid_token::v3::Response),
62 MatrixEventRead(Vec<Raw<AnyTimelineEvent>>),
65 MatrixEventSent(SendEventResponse),
68 MatrixDelayedEventUpdate(delayed_events::update_delayed_event::unstable::Response),
69}
70
71pub(super) struct IncomingWidgetMessage {
72 pub(super) widget_id: String,
73 pub(super) request_id: String,
74 pub(super) kind: IncomingWidgetMessageKind,
75}
76
77#[derive(Debug)]
78pub(super) enum IncomingWidgetMessageKind {
79 Request(Raw<FromWidgetRequest>),
80 Response(ToWidgetResponse),
81}
82
83impl<'de> Deserialize<'de> for IncomingWidgetMessage {
84 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
85 where
86 D: Deserializer<'de>,
87 {
88 let raw: Box<RawJsonValue> = Box::deserialize(deserializer)?;
89
90 #[derive(Deserialize)]
91 #[serde(rename_all = "camelCase")]
92 enum ApiTag {
93 FromWidget,
94 ToWidget,
95 }
96
97 #[derive(Deserialize)]
98 #[serde(rename_all = "camelCase")]
99 struct ExtractHeader {
100 api: ApiTag,
101 widget_id: String,
102 request_id: String,
103 }
104
105 let ExtractHeader { api, widget_id, request_id } =
106 serde_json::from_str(raw.get()).map_err(de::Error::custom)?;
107
108 let kind = match api {
109 ApiTag::FromWidget => IncomingWidgetMessageKind::Request(Raw::from_json(raw)),
110 ApiTag::ToWidget => serde_json::from_str(raw.get())
111 .map(IncomingWidgetMessageKind::Response)
112 .map_err(de::Error::custom)?,
113 };
114
115 Ok(Self { widget_id, request_id, kind })
116 }
117}