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:: { self , 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,9 @@ 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 . send_from_widget_error_response( raw_request, Error :: SerdeJson ( e) ) ]
208+ }
207209 } ;
208210
209211 match request {
@@ -252,28 +254,29 @@ impl WidgetMachine {
252254 let CapabilitiesState :: Negotiated ( capabilities) = & self . capabilities else {
253255 let text =
254256 "Received send update delayed event request before capabilities were negotiated" ;
255- return vec ! [ self . send_from_widget_error_response( raw_request, text) ] ;
257+ return vec ! [ self . send_from_widget_error_response( raw_request, text. into ( ) ) ] ;
256258 } ;
257259 if !capabilities. update_delayed_event {
258260 return vec ! [ self . send_from_widget_error_response(
259261 raw_request,
260- format!(
261- "Not allowed: missing the {} capability." ,
262- capabilities:: UPDATE_DELAYED_EVENT
263- ) ,
262+ format!( "Not allowed: missing the {UPDATE_DELAYED_EVENT} capability." )
263+ . into( ) ,
264264 ) ] ;
265265 }
266266 let ( request, request_action) =
267267 self . send_matrix_driver_request ( UpdateDelayedEventRequest {
268268 action : req. action ,
269269 delay_id : req. delay_id ,
270270 } ) ;
271- request. then ( |res , machine| {
271+ request. then ( |result , machine| {
272272 vec ! [ machine. send_from_widget_result_response(
273273 raw_request,
274274 // This is mapped to another type because the update_delay_event::Response
275275 // does not impl Serialize
276- res. map( Into :: <UpdateDelayedEventResponse >:: into) ,
276+ match result {
277+ Ok ( response) => Ok ( Into :: <UpdateDelayedEventResponse >:: into( response) ) ,
278+ Err ( e) => Err ( ( & e) . into( ) ) ,
279+ } ,
277280 ) ]
278281 } ) ;
279282 request_action. map ( |a| vec ! [ a] ) . unwrap_or_default ( )
@@ -288,7 +291,7 @@ impl WidgetMachine {
288291 ) -> Option < Action > {
289292 let CapabilitiesState :: Negotiated ( capabilities) = & self . capabilities else {
290293 let text = "Received read event request before capabilities were negotiated" ;
291- return Some ( self . send_from_widget_error_response ( raw_request, text) ) ;
294+ return Some ( self . send_from_widget_error_response ( raw_request, text. into ( ) ) ) ;
292295 } ;
293296
294297 match request {
@@ -297,7 +300,7 @@ impl WidgetMachine {
297300 if !capabilities. read . iter ( ) . any ( filter_fn) {
298301 return Some ( self . send_from_widget_error_response (
299302 raw_request,
300- "Not allowed to read message like event" ,
303+ "Not allowed to read message like event" . into ( ) ,
301304 ) ) ;
302305 }
303306
@@ -306,16 +309,32 @@ impl WidgetMachine {
306309 let request = ReadMessageLikeEventRequest { event_type, limit } ;
307310 let ( request, action) = self . send_matrix_driver_request ( request) ;
308311 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- } ;
312+ let response = match ( result, & machine. capabilities ) {
313+ ( Ok ( mut events) , CapabilitiesState :: Negotiated ( capabilities) ) => {
314+ events. retain ( |e| capabilities. raw_event_matches_read_filter ( e) ) ;
315+ Ok ( ReadEventResponse { events } )
316+ }
317+ ( Ok ( _) , _) => {
318+ Err ( "Received read event request before capabilities negotiation"
319+ . into ( ) )
320+ }
321+ ( Err ( e) , _) => Err ( ( & e) . into ( ) ) ,
322+ } ;
315323
316- events. retain ( |e| capabilities. raw_event_matches_read_filter ( e) ) ;
317- Ok ( ReadEventResponse { events } )
318- } ) ;
324+ // let response = result
325+ // .and_then(|mut events| {
326+ // let CapabilitiesState::Negotiated(capabilities) = &machine.capabilities
327+ // else {
328+ // return Err(Error::UnknownError(
329+ // "Received read event request before capabilities negotiation"
330+ // .into(),
331+ // ));
332+ // };
333+
334+ // events.retain(|e| capabilities.raw_event_matches_read_filter(e));
335+ // Ok(ReadEventResponse { events })
336+ // })
337+ // .map_err(|e| (&e).into());
319338 vec ! [ machine. send_from_widget_result_response( raw_request, response) ]
320339 } ) ;
321340 action
@@ -343,14 +362,16 @@ impl WidgetMachine {
343362 let request = ReadStateEventRequest { event_type, state_key } ;
344363 let ( request, action) = self . send_matrix_driver_request ( request) ;
345364 request. then ( |result, machine| {
346- let response = result. map ( |events| ReadEventResponse { events } ) ;
365+ let response = result
366+ . map ( |events| ReadEventResponse { events } )
367+ . map_err ( |e| ( & e) . into ( ) ) ;
347368 vec ! [ machine. send_from_widget_result_response( raw_request, response) ]
348369 } ) ;
349370 action
350371 } else {
351372 Some ( self . send_from_widget_error_response (
352373 raw_request,
353- "Not allowed to read state event" ,
374+ "Not allowed to read state event" . into ( ) ,
354375 ) )
355376 }
356377 }
@@ -380,15 +401,15 @@ impl WidgetMachine {
380401 if !capabilities. send_delayed_event && request. delay . is_some ( ) {
381402 return Some ( self . send_from_widget_error_response (
382403 raw_request,
383- format ! (
384- "Not allowed: missing the {} capability." ,
385- capabilities:: SEND_DELAYED_EVENT
386- ) ,
404+ format ! ( "Not allowed: missing the {SEND_DELAYED_EVENT} capability." ) . into ( ) ,
387405 ) ) ;
388406 }
389407 if !capabilities. send . iter ( ) . any ( |filter| filter. matches ( & filter_in) ) {
390408 return Some (
391- self . send_from_widget_error_response ( raw_request, "Not allowed to send event" ) ,
409+ self . send_from_widget_error_response (
410+ raw_request,
411+ "Not allowed to send event" . into ( ) ,
412+ ) ,
392413 ) ;
393414 }
394415
@@ -397,7 +418,8 @@ impl WidgetMachine {
397418 if let Ok ( r) = result. as_mut ( ) {
398419 r. set_room_id ( machine. room_id . clone ( ) ) ;
399420 }
400- vec ! [ machine. send_from_widget_result_response( raw_request, result) ]
421+ vec ! [ machine
422+ . send_from_widget_result_response( raw_request, result. map_err( |e| ( & e) . into( ) ) ) ]
401423 } ) ;
402424 action
403425 }
@@ -439,7 +461,7 @@ impl WidgetMachine {
439461 fn process_matrix_driver_response (
440462 & mut self ,
441463 request_id : Uuid ,
442- response : Result < MatrixDriverResponse , String > ,
464+ response : Result < MatrixDriverResponse , Error > ,
443465 ) -> Vec < Action > {
444466 match self . pending_matrix_driver_requests . extract ( & request_id) {
445467 Ok ( request) => request
@@ -472,15 +494,15 @@ impl WidgetMachine {
472494 fn send_from_widget_error_response (
473495 & self ,
474496 raw_request : Raw < FromWidgetRequest > ,
475- error : impl fmt :: Display ,
497+ error : FromWidgetErrorResponse ,
476498 ) -> Action {
477- self . send_from_widget_response ( raw_request, FromWidgetErrorResponse :: new ( error) )
499+ self . send_from_widget_response ( raw_request, error)
478500 }
479501
480502 fn send_from_widget_result_response (
481503 & self ,
482504 raw_request : Raw < FromWidgetRequest > ,
483- result : Result < impl Serialize , impl fmt :: Display > ,
505+ result : Result < impl Serialize , FromWidgetErrorResponse > ,
484506 ) -> Action {
485507 match result {
486508 Ok ( res) => self . send_from_widget_response ( raw_request, res) ,
@@ -586,7 +608,7 @@ impl ToWidgetRequestMeta {
586608}
587609
588610type MatrixDriverResponseFn =
589- Box < dyn FnOnce ( Result < MatrixDriverResponse , String > , & mut WidgetMachine ) -> Vec < Action > + Send > ;
611+ Box < dyn FnOnce ( Result < MatrixDriverResponse , Error > , & mut WidgetMachine ) -> Vec < Action > + Send > ;
590612
591613pub ( crate ) struct MatrixDriverRequestMeta {
592614 response_fn : Option < MatrixDriverResponseFn > ,
0 commit comments