Skip to content

Commit e62e013

Browse files
committed
refactor response sending api
1 parent c2d676e commit e62e013

File tree

1 file changed

+64
-45
lines changed
  • crates/matrix-sdk/src/widget/machine

1 file changed

+64
-45
lines changed

crates/matrix-sdk/src/widget/machine/mod.rs

Lines changed: 64 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ impl WidgetMachine {
214214
let request = match raw_request.deserialize() {
215215
Ok(r) => r,
216216
Err(e) => {
217-
return vec![Self::send_from_widget_response(
217+
return vec![Self::send_from_widget_err_response(
218218
raw_request,
219219
FromWidgetErrorResponse::from_error(&crate::Error::SerdeJson(e)),
220220
)]
@@ -224,12 +224,12 @@ impl WidgetMachine {
224224
match request {
225225
FromWidgetRequest::SupportedApiVersions {} => {
226226
let response = SupportedApiVersionsResponse::new();
227-
vec![Self::send_from_widget_response(raw_request, response)]
227+
vec![Self::send_from_widget_response(raw_request, Ok(response))]
228228
}
229229

230230
FromWidgetRequest::ContentLoaded {} => {
231231
let mut response =
232-
vec![Self::send_from_widget_response(raw_request, JsonObject::new())];
232+
vec![Self::send_from_widget_response(raw_request, Ok(JsonObject::new()))];
233233
if self.capabilities.is_unset() {
234234
response.append(&mut self.negotiate_capabilities());
235235
}
@@ -262,26 +262,21 @@ impl WidgetMachine {
262262
});
263263

264264
let response =
265-
Self::send_from_widget_response(raw_request, OpenIdResponse::Pending);
265+
Self::send_from_widget_response(raw_request, Ok(OpenIdResponse::Pending));
266266
iter::once(response).chain(request_action).collect()
267267
}
268268

269269
FromWidgetRequest::DelayedEventUpdate(req) => {
270270
let CapabilitiesState::Negotiated(capabilities) = &self.capabilities else {
271271
let text =
272272
"Received send update delayed event request before capabilities were negotiated";
273-
return vec![Self::send_from_widget_response(
274-
raw_request,
275-
FromWidgetErrorResponse::from_string(text),
276-
)];
273+
return vec![Self::send_from_widget_error_string_response(raw_request, text)];
277274
};
278275

279276
if !capabilities.update_delayed_event {
280-
return vec![Self::send_from_widget_response(
277+
return vec![Self::send_from_widget_error_string_response(
281278
raw_request,
282-
FromWidgetErrorResponse::from_string(format!(
283-
"Not allowed: missing the {UPDATE_DELAYED_EVENT} capability."
284-
)),
279+
"Not allowed: missing the {UPDATE_DELAYED_EVENT} capability.",
285280
)];
286281
}
287282

@@ -295,10 +290,9 @@ impl WidgetMachine {
295290
raw_request,
296291
// This is mapped to another type because the update_delay_event::Response
297292
// does not impl Serialize
298-
match result {
299-
Ok(response) => Ok(Into::<UpdateDelayedEventResponse>::into(response)),
300-
Err(e) => Err(FromWidgetErrorResponse::from_error(&e)),
301-
},
293+
result
294+
.map(|r| Into::<UpdateDelayedEventResponse>::into(r))
295+
.map_err(|e| FromWidgetErrorResponse::from_error(&e)),
302296
)]
303297
});
304298

@@ -314,21 +308,16 @@ impl WidgetMachine {
314308
) -> Option<Action> {
315309
let CapabilitiesState::Negotiated(capabilities) = &self.capabilities else {
316310
let text = "Received read event request before capabilities were negotiated";
317-
return Some(Self::send_from_widget_response(
318-
raw_request,
319-
FromWidgetErrorResponse::from_string(text),
320-
));
311+
return Some(Self::send_from_widget_error_string_response(raw_request, text));
321312
};
322313

323314
match request {
324315
ReadEventRequest::ReadMessageLikeEvent { event_type, limit } => {
325316
if !capabilities.read.iter().any(|f| f.matches_message_like_event_type(&event_type))
326317
{
327-
return Some(Self::send_from_widget_response(
318+
return Some(Self::send_from_widget_error_string_response(
328319
raw_request,
329-
FromWidgetErrorResponse::from_string(
330-
"Not allowed to read message like event",
331-
),
320+
"Not allowed to read message like event",
332321
));
333322
}
334323

@@ -392,9 +381,9 @@ impl WidgetMachine {
392381
});
393382
action
394383
} else {
395-
Some(Self::send_from_widget_response(
384+
Some(Self::send_from_widget_error_string_response(
396385
raw_request,
397-
FromWidgetErrorResponse::from_string("Not allowed to read state event"),
386+
"Not allowed to read state event",
398387
))
399388
}
400389
}
@@ -423,18 +412,16 @@ impl WidgetMachine {
423412
};
424413

425414
if !capabilities.send_delayed_event && request.delay.is_some() {
426-
return Some(Self::send_from_widget_response(
415+
return Some(Self::send_from_widget_error_string_response(
427416
raw_request,
428-
FromWidgetErrorResponse::from_string(format!(
429-
"Not allowed: missing the {SEND_DELAYED_EVENT} capability."
430-
)),
417+
format!("Not allowed: missing the {SEND_DELAYED_EVENT} capability."),
431418
));
432419
}
433420

434421
if !capabilities.send.iter().any(|filter| filter.matches(&filter_in)) {
435-
return Some(Self::send_from_widget_response(
422+
return Some(Self::send_from_widget_error_string_response(
436423
raw_request,
437-
FromWidgetErrorResponse::from_string("Not allowed to send event"),
424+
"Not allowed to send event",
438425
));
439426
}
440427

@@ -503,24 +490,56 @@ impl WidgetMachine {
503490
}
504491
}
505492
}
493+
fn send_from_widget_error_string_response(
494+
raw_request: Raw<FromWidgetRequest>,
495+
error: impl Into<String>,
496+
) -> Action {
497+
Self::send_from_widget_err_response(
498+
raw_request,
499+
FromWidgetErrorResponse::from_string(error),
500+
)
501+
}
506502

507-
#[instrument(skip_all)]
508-
fn send_from_widget_response(
503+
fn send_from_widget_err_response(
509504
raw_request: Raw<FromWidgetRequest>,
510-
response_data: impl Serialize,
505+
error: FromWidgetErrorResponse,
511506
) -> Action {
512-
let f = || {
513-
let mut object = raw_request.deserialize_as::<IndexMap<String, Box<RawJsonValue>>>()?;
514-
let response_data = serde_json::value::to_raw_value(&response_data)?;
515-
object.insert("response".to_owned(), response_data);
516-
serde_json::to_string(&object)
517-
};
507+
Self::send_from_widget_response(
508+
raw_request,
509+
Err::<serde_json::Value, FromWidgetErrorResponse>(error),
510+
)
511+
}
518512

519-
// SAFETY: we expect the raw request to be a valid JSON map, to which we add a
520-
// new field.
521-
let serialized = f().expect("error when attaching response to incoming request");
513+
fn send_from_widget_response(
514+
raw_request: Raw<FromWidgetRequest>,
515+
result: Result<impl Serialize, FromWidgetErrorResponse>,
516+
) -> Action {
517+
// we do not want tho expose this to never allow sending arbitrary errors.
518+
// Errors always need to be `FromWidgetErrorResponse`.
519+
#[instrument(skip_all)]
520+
fn send_response_data(
521+
raw_request: Raw<FromWidgetRequest>,
522+
response_data: impl Serialize,
523+
) -> Action {
524+
let f = || {
525+
let mut object =
526+
raw_request.deserialize_as::<IndexMap<String, Box<RawJsonValue>>>()?;
527+
let response_data = serde_json::value::to_raw_value(&response_data)?;
528+
object.insert("response".to_owned(), response_data);
529+
serde_json::to_string(&object)
530+
};
531+
532+
// SAFETY: we expect the raw request to be a valid JSON map, to which we add a
533+
// new field.
534+
let serialized = f().expect("error when attaching response to incoming request");
535+
536+
Action::SendToWidget(serialized)
537+
}
522538

523-
Action::SendToWidget(serialized)
539+
match result {
540+
Ok(res) => send_response_data(raw_request, res),
541+
Err(error_response) => send_response_data(raw_request, error_response),
542+
}
524543
}
525544

526545
#[instrument(skip_all, fields(action = T::ACTION))]

0 commit comments

Comments
 (0)