1616
1717#![ warn( unreachable_pub) ]
1818
19- use std:: { fmt , iter, time:: Duration } ;
19+ use std:: { iter, time:: Duration } ;
2020
2121use driver_req:: UpdateDelayedEventRequest ;
2222use from_widget:: UpdateDelayedEventResponse ;
@@ -50,11 +50,11 @@ use self::{
5050#[ cfg( doc) ]
5151use super :: WidgetDriver ;
5252use super :: {
53- capabilities,
53+ capabilities:: { SEND_DELAYED_EVENT , UPDATE_DELAYED_EVENT } ,
5454 filter:: { MatrixEventContent , MatrixEventFilterInput } ,
5555 Capabilities , StateKeySelector ,
5656} ;
57- use crate :: widget:: EventFilter ;
57+ use crate :: { widget:: EventFilter , Error } ;
5858
5959mod driver_req;
6060mod from_widget;
@@ -203,7 +203,10 @@ impl WidgetMachine {
203203 ) -> Vec < Action > {
204204 let request = match raw_request. deserialize ( ) {
205205 Ok ( r) => r,
206- Err ( e) => return vec ! [ self . send_from_widget_error_response( raw_request, e) ] ,
206+ Err ( e) => {
207+ return vec ! [ self
208+ . send_from_widget_error_response( raw_request, ( & Error :: SerdeJson ( e) ) . into( ) ) ]
209+ }
207210 } ;
208211
209212 match request {
@@ -252,28 +255,29 @@ impl WidgetMachine {
252255 let CapabilitiesState :: Negotiated ( capabilities) = & self . capabilities else {
253256 let text =
254257 "Received send update delayed event request before capabilities were negotiated" ;
255- return vec ! [ self . send_from_widget_error_response( raw_request, text) ] ;
258+ return vec ! [ self . send_from_widget_error_response( raw_request, text. into ( ) ) ] ;
256259 } ;
257260 if !capabilities. update_delayed_event {
258261 return vec ! [ self . send_from_widget_error_response(
259262 raw_request,
260- format!(
261- "Not allowed: missing the {} capability." ,
262- capabilities:: UPDATE_DELAYED_EVENT
263- ) ,
263+ format!( "Not allowed: missing the {UPDATE_DELAYED_EVENT} capability." )
264+ . into( ) ,
264265 ) ] ;
265266 }
266267 let ( request, request_action) =
267268 self . send_matrix_driver_request ( UpdateDelayedEventRequest {
268269 action : req. action ,
269270 delay_id : req. delay_id ,
270271 } ) ;
271- request. then ( |res , machine| {
272+ request. then ( |result , machine| {
272273 vec ! [ machine. send_from_widget_result_response(
273274 raw_request,
274275 // This is mapped to another type because the update_delay_event::Response
275276 // does not impl Serialize
276- res. map( Into :: <UpdateDelayedEventResponse >:: into) ,
277+ match result {
278+ Ok ( response) => Ok ( Into :: <UpdateDelayedEventResponse >:: into( response) ) ,
279+ Err ( e) => Err ( ( & e) . into( ) ) ,
280+ } ,
277281 ) ]
278282 } ) ;
279283 request_action. map ( |a| vec ! [ a] ) . unwrap_or_default ( )
@@ -288,7 +292,7 @@ impl WidgetMachine {
288292 ) -> Option < Action > {
289293 let CapabilitiesState :: Negotiated ( capabilities) = & self . capabilities else {
290294 let text = "Received read event request before capabilities were negotiated" ;
291- return Some ( self . send_from_widget_error_response ( raw_request, text) ) ;
295+ return Some ( self . send_from_widget_error_response ( raw_request, text. into ( ) ) ) ;
292296 } ;
293297
294298 match request {
@@ -297,7 +301,7 @@ impl WidgetMachine {
297301 if !capabilities. read . iter ( ) . any ( filter_fn) {
298302 return Some ( self . send_from_widget_error_response (
299303 raw_request,
300- "Not allowed to read message like event" ,
304+ "Not allowed to read message like event" . into ( ) ,
301305 ) ) ;
302306 }
303307
@@ -306,16 +310,21 @@ impl WidgetMachine {
306310 let request = ReadMessageLikeEventRequest { event_type, limit } ;
307311 let ( request, action) = self . send_matrix_driver_request ( request) ;
308312 request. then ( |result, machine| {
309- let response = result. and_then ( |mut events| {
310- let CapabilitiesState :: Negotiated ( capabilities) = & machine. capabilities
311- else {
312- let err = "Received read event request before capabilities negotiation" ;
313- return Err ( err. into ( ) ) ;
314- } ;
315-
316- events. retain ( |e| capabilities. raw_event_matches_read_filter ( e) ) ;
317- Ok ( ReadEventResponse { events } )
318- } ) ;
313+ let response = match ( result, & machine. capabilities ) {
314+ ( Ok ( mut events) , CapabilitiesState :: Negotiated ( capabilities) ) => {
315+ events. retain ( |e| capabilities. raw_event_matches_read_filter ( e) ) ;
316+ Ok ( ReadEventResponse { events } )
317+ }
318+ ( Ok ( _) , CapabilitiesState :: Unset ) => {
319+ Err ( "Received read event request before capabilities negotiation"
320+ . into ( ) )
321+ }
322+ ( Ok ( _) , CapabilitiesState :: Negotiating ) => {
323+ Err ( "Received read event request while capabilities were negotiating"
324+ . into ( ) )
325+ }
326+ ( Err ( e) , _) => Err ( ( & e) . into ( ) ) ,
327+ } ;
319328 vec ! [ machine. send_from_widget_result_response( raw_request, response) ]
320329 } ) ;
321330 action
@@ -343,14 +352,16 @@ impl WidgetMachine {
343352 let request = ReadStateEventRequest { event_type, state_key } ;
344353 let ( request, action) = self . send_matrix_driver_request ( request) ;
345354 request. then ( |result, machine| {
346- let response = result. map ( |events| ReadEventResponse { events } ) ;
355+ let response = result
356+ . map ( |events| ReadEventResponse { events } )
357+ . map_err ( |e| ( & e) . into ( ) ) ;
347358 vec ! [ machine. send_from_widget_result_response( raw_request, response) ]
348359 } ) ;
349360 action
350361 } else {
351362 Some ( self . send_from_widget_error_response (
352363 raw_request,
353- "Not allowed to read state event" ,
364+ "Not allowed to read state event" . into ( ) ,
354365 ) )
355366 }
356367 }
@@ -380,15 +391,15 @@ impl WidgetMachine {
380391 if !capabilities. send_delayed_event && request. delay . is_some ( ) {
381392 return Some ( self . send_from_widget_error_response (
382393 raw_request,
383- format ! (
384- "Not allowed: missing the {} capability." ,
385- capabilities:: SEND_DELAYED_EVENT
386- ) ,
394+ format ! ( "Not allowed: missing the {SEND_DELAYED_EVENT} capability." ) . into ( ) ,
387395 ) ) ;
388396 }
389397 if !capabilities. send . iter ( ) . any ( |filter| filter. matches ( & filter_in) ) {
390398 return Some (
391- self . send_from_widget_error_response ( raw_request, "Not allowed to send event" ) ,
399+ self . send_from_widget_error_response (
400+ raw_request,
401+ "Not allowed to send event" . into ( ) ,
402+ ) ,
392403 ) ;
393404 }
394405
@@ -397,7 +408,8 @@ impl WidgetMachine {
397408 if let Ok ( r) = result. as_mut ( ) {
398409 r. set_room_id ( machine. room_id . clone ( ) ) ;
399410 }
400- vec ! [ machine. send_from_widget_result_response( raw_request, result) ]
411+ vec ! [ machine
412+ . send_from_widget_result_response( raw_request, result. map_err( |e| ( & e) . into( ) ) ) ]
401413 } ) ;
402414 action
403415 }
@@ -439,7 +451,7 @@ impl WidgetMachine {
439451 fn process_matrix_driver_response (
440452 & mut self ,
441453 request_id : Uuid ,
442- response : Result < MatrixDriverResponse , String > ,
454+ response : Result < MatrixDriverResponse , Error > ,
443455 ) -> Vec < Action > {
444456 match self . pending_matrix_driver_requests . extract ( & request_id) {
445457 Ok ( request) => request
@@ -472,15 +484,15 @@ impl WidgetMachine {
472484 fn send_from_widget_error_response (
473485 & self ,
474486 raw_request : Raw < FromWidgetRequest > ,
475- error : impl fmt :: Display ,
487+ error : FromWidgetErrorResponse ,
476488 ) -> Action {
477- self . send_from_widget_response ( raw_request, FromWidgetErrorResponse :: new ( error) )
489+ self . send_from_widget_response ( raw_request, error)
478490 }
479491
480492 fn send_from_widget_result_response (
481493 & self ,
482494 raw_request : Raw < FromWidgetRequest > ,
483- result : Result < impl Serialize , impl fmt :: Display > ,
495+ result : Result < impl Serialize , FromWidgetErrorResponse > ,
484496 ) -> Action {
485497 match result {
486498 Ok ( res) => self . send_from_widget_response ( raw_request, res) ,
@@ -586,7 +598,7 @@ impl ToWidgetRequestMeta {
586598}
587599
588600type MatrixDriverResponseFn =
589- Box < dyn FnOnce ( Result < MatrixDriverResponse , String > , & mut WidgetMachine ) -> Vec < Action > + Send > ;
601+ Box < dyn FnOnce ( Result < MatrixDriverResponse , Error > , & mut WidgetMachine ) -> Vec < Action > + Send > ;
590602
591603pub ( crate ) struct MatrixDriverRequestMeta {
592604 response_fn : Option < MatrixDriverResponseFn > ,
0 commit comments