@@ -237,9 +237,14 @@ macro_rules! task_impl {
237
237
unsafe { from_glib( ffi:: g_task_return_error_if_cancelled( self . to_glib_none( ) . 0 ) ) }
238
238
}
239
239
240
+ // rustdoc-stripper-ignore-next
241
+ /// Set the result of the task
242
+ ///
243
+ /// # Safety
244
+ ///
245
+ /// The value must be read with [`Task::propagate`],
246
+ /// `g_task_propagate_value` or `g_task_propagate_pointer`.
240
247
#[ doc( alias = "g_task_return_value" ) ]
241
- #[ doc( alias = "g_task_return_boolean" ) ]
242
- #[ doc( alias = "g_task_return_int" ) ]
243
248
#[ doc( alias = "g_task_return_pointer" ) ]
244
249
#[ doc( alias = "g_task_return_error" ) ]
245
250
#[ allow( unused_unsafe) ]
@@ -272,12 +277,51 @@ macro_rules! task_impl {
272
277
}
273
278
}
274
279
280
+ // rustdoc-stripper-ignore-next
281
+ /// Set the result of the task as a boolean
282
+ ///
283
+ /// # Safety
284
+ ///
285
+ /// The value must be read with [`Task::propagate_boolean`],
286
+ /// or `g_task_propagate_boolean`.
287
+ #[ doc( alias = "g_task_return_boolean" ) ]
288
+ #[ allow( unused_unsafe) ]
289
+ pub $( $safety) ? fn return_boolean_result( self , result: Result <bool , glib:: Error >) {
290
+ match result {
291
+ Ok ( v) => unsafe { ffi:: g_task_return_boolean( self . to_glib_none( ) . 0 , v as i32 ) } ,
292
+ Err ( e) => unsafe { ffi:: g_task_return_error( self . to_glib_none( ) . 0 , e. into_glib_ptr( ) ) } ,
293
+ }
294
+ }
295
+
296
+ // rustdoc-stripper-ignore-next
297
+ /// Set the result of the task as an int
298
+ ///
299
+ /// # Safety
300
+ ///
301
+ /// The value must be read with [`Task::propagate_int`],
302
+ /// or `g_task_propagate_int`.
303
+ #[ doc( alias = "g_task_return_int" ) ]
304
+ #[ allow( unused_unsafe) ]
305
+ pub $( $safety) ? fn return_int_result( self , result: Result <isize , glib:: Error >) {
306
+ match result {
307
+ Ok ( v) => unsafe { ffi:: g_task_return_int( self . to_glib_none( ) . 0 , v) } ,
308
+ Err ( e) => unsafe { ffi:: g_task_return_error( self . to_glib_none( ) . 0 , e. into_glib_ptr( ) ) } ,
309
+ }
310
+ }
311
+
312
+
313
+ // rustdoc-stripper-ignore-next
314
+ /// Gets the result of the task and transfers ownership of it
315
+ ///
316
+ /// # Safety
317
+ ///
318
+ /// This must only be called once, and only if the result was set
319
+ /// via [`Task::return_result`], `g_task_return_value` or
320
+ /// `g_task_return_pointer`.
275
321
#[ doc( alias = "g_task_propagate_value" ) ]
276
- #[ doc( alias = "g_task_propagate_boolean" ) ]
277
- #[ doc( alias = "g_task_propagate_int" ) ]
278
322
#[ doc( alias = "g_task_propagate_pointer" ) ]
279
323
#[ allow( unused_unsafe) ]
280
- pub $ ( $safety ) ? fn propagate( self ) -> Result <V , glib:: Error > {
324
+ pub unsafe fn propagate( self ) -> Result <V , glib:: Error > {
281
325
let mut error = ptr:: null_mut( ) ;
282
326
283
327
unsafe {
@@ -313,6 +357,52 @@ macro_rules! task_impl {
313
357
}
314
358
}
315
359
}
360
+
361
+ // rustdoc-stripper-ignore-next
362
+ /// Gets the result of the task as a boolean, or the error
363
+ ///
364
+ /// # Safety
365
+ ///
366
+ /// This must only be called once, and only if the result was set
367
+ /// via [`Task::return_boolean_result`], or `g_task_return_boolean`.
368
+ #[ doc( alias = "g_task_propagate_boolean" ) ]
369
+ #[ allow( unused_unsafe) ]
370
+ pub unsafe fn propagate_boolean( self ) -> Result <bool , glib:: Error > {
371
+ let mut error = ptr:: null_mut( ) ;
372
+
373
+ unsafe {
374
+ let res = ffi:: g_task_propagate_boolean( self . to_glib_none( ) . 0 , & mut error) ;
375
+
376
+ if error. is_null( ) {
377
+ Ok ( res != 0 )
378
+ } else {
379
+ Err ( from_glib_full( error) )
380
+ }
381
+ }
382
+ }
383
+
384
+ // rustdoc-stripper-ignore-next
385
+ /// Gets the result of the task as an int, or the error
386
+ ///
387
+ /// # Safety
388
+ ///
389
+ /// This must only be called once, and only if the result was set
390
+ /// via [`Task::return_int_result`], or `g_task_return_int`.
391
+ #[ doc( alias = "g_task_propagate_int" ) ]
392
+ #[ allow( unused_unsafe) ]
393
+ pub unsafe fn propagate_int( self ) -> Result <isize , glib:: Error > {
394
+ let mut error = ptr:: null_mut( ) ;
395
+
396
+ unsafe {
397
+ let res = ffi:: g_task_propagate_int( self . to_glib_none( ) . 0 , & mut error) ;
398
+
399
+ if error. is_null( ) {
400
+ Ok ( res)
401
+ } else {
402
+ Err ( from_glib_full( error) )
403
+ }
404
+ }
405
+ }
316
406
}
317
407
}
318
408
}
@@ -447,7 +537,7 @@ mod test {
447
537
use crate :: { prelude:: * , test_util:: run_async_local} ;
448
538
449
539
#[ test]
450
- fn test_int_async_result ( ) {
540
+ fn test_int_value_async_result ( ) {
451
541
let fut = run_async_local ( |tx, l| {
452
542
let cancellable = crate :: Cancellable :: new ( ) ;
453
543
let task = unsafe {
@@ -469,6 +559,52 @@ mod test {
469
559
}
470
560
}
471
561
562
+ #[ test]
563
+ fn test_boolean_async_result ( ) {
564
+ let fut = run_async_local ( |tx, l| {
565
+ let cancellable = crate :: Cancellable :: new ( ) ;
566
+ let task = unsafe {
567
+ crate :: LocalTask :: new (
568
+ None ,
569
+ Some ( & cancellable) ,
570
+ move |t : LocalTask < bool > , _b : Option < & glib:: Object > | {
571
+ tx. send ( t. propagate_boolean ( ) ) . unwrap ( ) ;
572
+ l. quit ( ) ;
573
+ } ,
574
+ )
575
+ } ;
576
+ task. return_boolean_result ( Ok ( true ) ) ;
577
+ } ) ;
578
+
579
+ match fut {
580
+ Err ( _) => panic ! ( ) ,
581
+ Ok ( i) => assert ! ( i) ,
582
+ }
583
+ }
584
+
585
+ #[ test]
586
+ fn test_int_async_result ( ) {
587
+ let fut = run_async_local ( |tx, l| {
588
+ let cancellable = crate :: Cancellable :: new ( ) ;
589
+ let task = unsafe {
590
+ crate :: LocalTask :: new (
591
+ None ,
592
+ Some ( & cancellable) ,
593
+ move |t : LocalTask < i32 > , _b : Option < & glib:: Object > | {
594
+ tx. send ( t. propagate_int ( ) ) . unwrap ( ) ;
595
+ l. quit ( ) ;
596
+ } ,
597
+ )
598
+ } ;
599
+ task. return_int_result ( Ok ( 100_isize ) ) ;
600
+ } ) ;
601
+
602
+ match fut {
603
+ Err ( _) => panic ! ( ) ,
604
+ Ok ( i) => assert_eq ! ( i, 100 ) ,
605
+ }
606
+ }
607
+
472
608
#[ test]
473
609
fn test_object_async_result ( ) {
474
610
use glib:: subclass:: prelude:: * ;
0 commit comments