1
1
use gio:: { prelude:: * , IOErrorEnum } ;
2
- use std:: sync:: mpsc:: { channel, Receiver , Sender } ;
2
+ use std:: {
3
+ sync:: mpsc:: { channel, Receiver , Sender } ,
4
+ time:: Duration ,
5
+ } ;
3
6
4
7
const EXAMPLE_XML : & str = r#"
5
8
<node>
@@ -8,6 +11,11 @@ const EXAMPLE_XML: &str = r#"
8
11
<arg type='s' name='name' direction='in'/>
9
12
<arg type='s' name='greet' direction='out'/>
10
13
</method>
14
+ <method name='SlowHello'>
15
+ <arg type='s' name='name' direction='in'/>
16
+ <arg type='u' name='delay' direction='in'/>
17
+ <arg type='s' name='greet' direction='out'/>
18
+ </method>
11
19
</interface>
12
20
</node>
13
21
"# ;
@@ -17,15 +25,23 @@ struct Hello {
17
25
name : String ,
18
26
}
19
27
28
+ #[ derive( Debug , glib:: Variant ) ]
29
+ struct SlowHello {
30
+ name : String ,
31
+ delay : u32 ,
32
+ }
33
+
20
34
#[ derive( Debug ) ]
21
35
enum Call {
22
36
Hello ( Hello ) ,
37
+ SlowHello ( SlowHello ) ,
23
38
}
24
39
25
40
impl Call {
26
41
pub fn parse ( method : & str , parameters : glib:: Variant ) -> Result < Call , glib:: Error > {
27
42
match method {
28
43
"Hello" => Ok ( parameters. get :: < Hello > ( ) . map ( Call :: Hello ) ) ,
44
+ "SlowHello" => Ok ( parameters. get :: < SlowHello > ( ) . map ( Call :: SlowHello ) ) ,
29
45
_ => Err ( glib:: Error :: new ( IOErrorEnum :: Failed , "No such method" ) ) ,
30
46
}
31
47
. and_then ( |p| p. ok_or_else ( || glib:: Error :: new ( IOErrorEnum :: Failed , "Invalid parameters" ) ) )
@@ -42,21 +58,24 @@ fn on_startup(app: &gio::Application, tx: &Sender<gio::RegistrationId>) {
42
58
43
59
if let Ok ( id) = connection
44
60
. register_object ( "/com/github/gtk_rs/examples/HelloWorld" , & example)
45
- . method_call ( glib:: clone!(
46
- #[ strong]
47
- app,
48
- move |_, _, _, _, method, params, invocation| {
49
- let result = Call :: parse( method, params) . map( |call| match call {
61
+ . method_call ( move |_, _, _, _, method, params, invocation| {
62
+ let call = Call :: parse ( method, params) ;
63
+ invocation. return_future_local ( async move {
64
+ match call? {
50
65
Call :: Hello ( Hello { name } ) => {
51
66
let greet = format ! ( "Hello {name}!" ) ;
52
67
println ! ( "{greet}" ) ;
53
- Some ( greet. to_variant( ) )
68
+ Ok ( Some ( greet. to_variant ( ) ) )
69
+ }
70
+ Call :: SlowHello ( SlowHello { name, delay } ) => {
71
+ glib:: timeout_future ( Duration :: from_secs ( delay as u64 ) ) . await ;
72
+ let greet = format ! ( "Hello {name} after {delay} seconds!" ) ;
73
+ println ! ( "{greet}" ) ;
74
+ Ok ( Some ( greet. to_variant ( ) ) )
54
75
}
55
- } ) ;
56
- invocation. return_result( result) ;
57
- app. quit( ) ;
58
- }
59
- ) )
76
+ }
77
+ } ) ;
78
+ } )
60
79
. build ( )
61
80
{
62
81
println ! ( "Registered object" ) ;
0 commit comments