Skip to content

Commit c9f6938

Browse files
committed
refactor(widget): get rid of WidgetDriverRequestHandle::null too
1 parent 939af52 commit c9f6938

File tree

2 files changed

+57
-55
lines changed

2 files changed

+57
-55
lines changed

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

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,9 @@ impl WidgetMachine {
173173
capabilities
174174
.raw_event_matches_read_filter(&event)
175175
.then(|| {
176-
let action = self.send_to_widget_request(NotifyNewMatrixEvent(event)).1;
177-
action.map(|a| vec![a]).unwrap_or_default()
176+
self.send_to_widget_request(NotifyNewMatrixEvent(event))
177+
.map(|(_request, action)| vec![action])
178+
.unwrap_or_default()
178179
})
179180
.unwrap_or_default()
180181
}
@@ -260,9 +261,10 @@ impl WidgetMachine {
260261
}
261262
};
262263

263-
let action =
264-
machine.send_to_widget_request(NotifyOpenIdChanged(response)).1;
265-
action.map(|a| vec![a]).unwrap_or_default()
264+
machine
265+
.send_to_widget_request(NotifyOpenIdChanged(response))
266+
.map(|(_request, action)| vec![action])
267+
.unwrap_or_default()
266268
});
267269

268270
request_action
@@ -562,7 +564,7 @@ impl WidgetMachine {
562564
fn send_to_widget_request<T: ToWidgetRequest>(
563565
&mut self,
564566
to_widget_request: T,
565-
) -> (ToWidgetRequestHandle<'_, T::ResponseData>, Option<Action>) {
567+
) -> Option<(ToWidgetRequestHandle<'_, T::ResponseData>, Action)> {
566568
#[derive(Serialize)]
567569
#[serde(tag = "api", rename = "toWidget", rename_all = "camelCase")]
568570
struct ToWidgetRequestSerdeHelper<'a, T> {
@@ -583,11 +585,11 @@ impl WidgetMachine {
583585
let request_meta = ToWidgetRequestMeta::new(T::ACTION);
584586
let Some(meta) = self.pending_to_widget_requests.insert(request_id, request_meta) else {
585587
warn!("Reached limits of pending requests for toWidget requests");
586-
return (ToWidgetRequestHandle::null(), None);
588+
return None;
587589
};
588590

589591
let serialized = serde_json::to_string(&full_request).expect("Failed to serialize request");
590-
(ToWidgetRequestHandle::new(meta), Some(Action::SendToWidget(serialized)))
592+
Some((ToWidgetRequestHandle::new(meta), Action::SendToWidget(serialized)))
591593
}
592594

593595
#[instrument(skip_all)]
@@ -615,40 +617,46 @@ impl WidgetMachine {
615617
matches!(&self.capabilities, CapabilitiesState::Negotiated(c) if !c.read.is_empty());
616618
self.capabilities = CapabilitiesState::Negotiating;
617619

618-
let (request, action) = self.send_to_widget_request(RequestCapabilities {});
619-
620-
request.then(|response, machine| {
621-
let requested = response.capabilities;
622-
623-
if let Some((request, action)) =
624-
machine.send_matrix_driver_request(AcquireCapabilities {
625-
desired_capabilities: requested.clone(),
626-
})
627-
{
628-
request.then(|result, machine| {
629-
let approved = result.unwrap_or_else(|e| {
630-
error!("Acquiring capabilities failed: {e}");
631-
Capabilities::default()
632-
});
633-
634-
let subscribe_required = !approved.read.is_empty();
635-
machine.capabilities = CapabilitiesState::Negotiated(approved.clone());
636-
637-
let update = NotifyCapabilitiesChanged { approved, requested };
638-
let (_request, action) = machine.send_to_widget_request(update);
620+
let action =
621+
self.send_to_widget_request(RequestCapabilities {}).map(|(request, action)| {
622+
request.then(|response, machine| {
623+
let requested = response.capabilities;
624+
625+
if let Some((request, action)) =
626+
machine.send_matrix_driver_request(AcquireCapabilities {
627+
desired_capabilities: requested.clone(),
628+
})
629+
{
630+
request.then(|result, machine| {
631+
let approved = result.unwrap_or_else(|e| {
632+
error!("Acquiring capabilities failed: {e}");
633+
Capabilities::default()
634+
});
635+
636+
let subscribe_required = !approved.read.is_empty();
637+
machine.capabilities = CapabilitiesState::Negotiated(approved.clone());
638+
639+
let update = NotifyCapabilitiesChanged { approved, requested };
640+
641+
let action = machine
642+
.send_to_widget_request(update)
643+
.map(|(_request, action)| action);
644+
645+
subscribe_required
646+
.then_some(Action::Subscribe)
647+
.into_iter()
648+
.chain(action)
649+
.collect()
650+
});
639651

640-
subscribe_required
641-
.then_some(Action::Subscribe)
642-
.into_iter()
643-
.chain(action)
644-
.collect()
652+
vec![action]
653+
} else {
654+
Vec::new()
655+
}
645656
});
646657

647-
vec![action]
648-
} else {
649-
Vec::new()
650-
}
651-
});
658+
action
659+
});
652660

653661
unsubscribe_required.then_some(Action::Unsubscribe).into_iter().chain(action).collect()
654662
}

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

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::widget::Capabilities;
2424

2525
/// A handle to a pending `toWidget` request.
2626
pub(crate) struct ToWidgetRequestHandle<'m, T> {
27-
request_meta: Option<&'m mut ToWidgetRequestMeta>,
27+
request_meta: &'m mut ToWidgetRequestMeta,
2828
_phantom: PhantomData<fn() -> T>,
2929
}
3030

@@ -33,28 +33,22 @@ where
3333
T: DeserializeOwned,
3434
{
3535
pub(crate) fn new(request_meta: &'m mut ToWidgetRequestMeta) -> Self {
36-
Self { request_meta: Some(request_meta), _phantom: PhantomData }
37-
}
38-
39-
pub(crate) fn null() -> Self {
40-
Self { request_meta: None, _phantom: PhantomData }
36+
Self { request_meta, _phantom: PhantomData }
4137
}
4238

4339
pub(crate) fn then(
4440
self,
4541
response_handler: impl FnOnce(T, &mut WidgetMachine) -> Vec<Action> + Send + 'static,
4642
) {
47-
if let Some(request_meta) = self.request_meta {
48-
request_meta.response_fn = Some(Box::new(move |raw_response_data, machine| {
49-
match serde_json::from_str(raw_response_data.get()) {
50-
Ok(response_data) => response_handler(response_data, machine),
51-
Err(e) => {
52-
error!("Failed to deserialize toWidget response: {e}");
53-
Vec::new()
54-
}
43+
self.request_meta.response_fn = Some(Box::new(move |raw_response_data, machine| {
44+
match serde_json::from_str(raw_response_data.get()) {
45+
Ok(response_data) => response_handler(response_data, machine),
46+
Err(e) => {
47+
error!("Failed to deserialize toWidget response: {e}");
48+
Vec::new()
5549
}
56-
}));
57-
}
50+
}
51+
}));
5852
}
5953
}
6054

0 commit comments

Comments
 (0)