@@ -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