widget: split parsing of common widget header

This commit is contained in:
Daniel Abramov
2023-10-18 12:56:32 +02:00
committed by Jonas Platte
parent 77bae6f421
commit 04fcc0bb87
4 changed files with 39 additions and 30 deletions
@@ -15,6 +15,5 @@
use serde::Deserialize;
#[derive(Deserialize)]
pub(super) enum FromWidgetRequest {
// TODO
}
#[serde(rename_all = "camelCase")]
pub(super) enum FromWidgetRequest {}
@@ -58,7 +58,13 @@ pub(crate) enum MatrixDriverResponse {
MatrixEventSent(OwnedEventId),
}
pub(super) enum IncomingWidgetMessage {
pub(super) struct IncomingWidgetMessage {
pub(super) widget_id: String,
pub(super) request_id: String,
pub(super) kind: IncomingWidgetMessageKind,
}
pub(super) enum IncomingWidgetMessageKind {
Request(FromWidgetRequest),
Response(ToWidgetResponse),
}
@@ -78,16 +84,25 @@ impl<'de> Deserialize<'de> for IncomingWidgetMessage {
}
#[derive(Deserialize)]
struct ExtractApiTag {
#[serde(rename_all = "camelCase")]
struct ExtractHeader {
api: ApiTag,
widget_id: String,
request_id: String,
}
let ExtractApiTag { api } = serde_json::from_str(raw.get()).map_err(de::Error::custom)?;
let ExtractHeader { api, widget_id, request_id } =
serde_json::from_str(raw.get()).map_err(de::Error::custom)?;
let res = match api {
ApiTag::FromWidget => serde_json::from_str(raw.get()).map(Self::Request),
ApiTag::ToWidget => serde_json::from_str(raw.get()).map(Self::Response),
let kind = match api {
ApiTag::FromWidget => serde_json::from_str(raw.get())
.map(IncomingWidgetMessageKind::Request)
.map_err(de::Error::custom)?,
ApiTag::ToWidget => serde_json::from_str(raw.get())
.map(IncomingWidgetMessageKind::Response)
.map_err(de::Error::custom)?,
};
res.map_err(de::Error::custom)
Ok(Self { widget_id, request_id, kind })
}
}
+15 -13
View File
@@ -25,7 +25,7 @@ use uuid::Uuid;
use self::{
driver_req::{AcquirePermissions, MatrixDriverRequest, MatrixDriverRequestHandle},
incoming::IncomingWidgetMessage,
incoming::{IncomingWidgetMessage, IncomingWidgetMessageKind},
to_widget::{
NotifyPermissionsChanged, RequestPermissions, ToWidgetRequest, ToWidgetRequestHandle,
ToWidgetResponse,
@@ -106,26 +106,28 @@ impl WidgetMachine {
return;
}
};
let widget_id_from_msg = match &message {
IncomingWidgetMessage::Request(req) => match *req {},
IncomingWidgetMessage::Response(res) => &res.widget_id,
};
if *widget_id_from_msg != self.widget_id {
if message.widget_id != self.widget_id {
error!("Received a message from a wrong widget, ignoring");
return;
}
match message {
IncomingWidgetMessage::Request(req) => match req {},
IncomingWidgetMessage::Response(response) => {
self.process_to_widget_response(response);
match message.kind {
IncomingWidgetMessageKind::Request(req) => match req {},
IncomingWidgetMessageKind::Response(response) => {
self.process_to_widget_response(message.request_id, response);
}
}
}
#[instrument(skip_all, fields(request_id = ?response.request_id))]
fn process_to_widget_response(&mut self, response: ToWidgetResponse) {
let Some(request) = self.pending_to_widget_requests.remove(&response.request_id) else {
#[instrument(skip_all, fields(request_id = ?request_id))]
fn process_to_widget_response(&mut self, request_id: String, response: ToWidgetResponse) {
let Ok(request_id) = Uuid::parse_str(&request_id) else {
error!("Response's request_id is not a valid UUID");
return;
};
let Some(request) = self.pending_to_widget_requests.remove(&request_id) else {
warn!("Received response for an unknown request");
return;
};
@@ -17,7 +17,6 @@ use std::marker::PhantomData;
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use serde_json::value::RawValue as RawJsonValue;
use tracing::error;
use uuid::Uuid;
use super::{ToWidgetRequestMeta, WidgetMachine};
use crate::widget::Permissions;
@@ -58,12 +57,6 @@ where
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct ToWidgetResponse {
/// The ID of the widget that sent this.
pub(super) widget_id: String,
/// The request ID that this response corresponds to.
pub(super) request_id: Uuid,
/// The action from the original request.
pub(super) action: String,