1
- use gio:: prelude:: * ;
1
+ use gio:: { prelude:: * , IOErrorEnum } ;
2
2
use std:: sync:: mpsc:: { channel, Receiver , Sender } ;
3
3
4
4
const EXAMPLE_XML : & str = r#"
@@ -12,6 +12,26 @@ const EXAMPLE_XML: &str = r#"
12
12
</node>
13
13
"# ;
14
14
15
+ #[ derive( Debug , glib:: Variant ) ]
16
+ struct Hello {
17
+ name : String ,
18
+ }
19
+
20
+ #[ derive( Debug ) ]
21
+ enum Call {
22
+ Hello ( Hello ) ,
23
+ }
24
+
25
+ impl Call {
26
+ pub fn parse ( method : & str , parameters : glib:: Variant ) -> Result < Call , glib:: Error > {
27
+ match method {
28
+ "Hello" => Ok ( parameters. get :: < Hello > ( ) . map ( Call :: Hello ) ) ,
29
+ _ => Err ( glib:: Error :: new ( IOErrorEnum :: Failed , "No such method" ) ) ,
30
+ }
31
+ . and_then ( |p| p. ok_or_else ( || glib:: Error :: new ( IOErrorEnum :: Failed , "Invalid parameters" ) ) )
32
+ }
33
+ }
34
+
15
35
fn on_startup ( app : & gio:: Application , tx : & Sender < gio:: RegistrationId > ) {
16
36
let connection = app. dbus_connection ( ) . expect ( "connection" ) ;
17
37
@@ -26,21 +46,14 @@ fn on_startup(app: &gio::Application, tx: &Sender<gio::RegistrationId>) {
26
46
#[ strong]
27
47
app,
28
48
move |_, _, _, _, method, params, invocation| {
29
- match method {
30
- "Hello" => {
31
- let result = <( String , ) >:: from_variant( & params)
32
- . ok_or_else( || {
33
- glib:: Error :: new( gio:: IOErrorEnum :: Failed , "Invalid parameters" )
34
- } )
35
- . map( |( name, ) | {
36
- let greet = format!( "Hello {name}!" ) ;
37
- println!( "{greet}" ) ;
38
- Some ( greet. to_variant( ) )
39
- } ) ;
40
- invocation. return_result( result) ;
49
+ let result = Call :: parse( method, params) . map( |call| match call {
50
+ Call :: Hello ( Hello { name } ) => {
51
+ let greet = format!( "Hello {name}!" ) ;
52
+ println!( "{greet}" ) ;
53
+ Some ( greet. to_variant( ) )
41
54
}
42
- _ => unreachable! ( ) ,
43
- }
55
+ } ) ;
56
+ invocation . return_result ( result ) ;
44
57
app. quit( ) ;
45
58
}
46
59
) )
0 commit comments