widget: split parsing of common widget header
This commit is contained in:
committed by
Jonas Platte
parent
77bae6f421
commit
04fcc0bb87
@@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
Reference in New Issue
Block a user