summaryrefslogtreecommitdiffstats
path: root/third_party/rust/audioipc2-client/src/send_recv.rs
blob: 1134c99a499669e71157fb5e38fa0d2d6440ee93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright © 2017 Mozilla Foundation
//
// This program is made available under an ISC-style license.  See the
// accompanying file LICENSE for details.

use cubeb_backend::Error;
use std::os::raw::c_int;

#[doc(hidden)]
pub fn _err<E>(e: E) -> Error
where
    E: Into<Option<c_int>>,
{
    match e.into() {
        Some(e) => Error::from_raw(e),
        None => Error::error(),
    }
}

#[macro_export]
macro_rules! send_recv {
    ($rpc:expr, $smsg:ident => $rmsg:ident) => {{
        let resp = send_recv!(__send $rpc, $smsg);
        send_recv!(__recv resp, $rmsg)
    }};
    ($rpc:expr, $smsg:ident => $rmsg:ident()) => {{
        let resp = send_recv!(__send $rpc, $smsg);
        send_recv!(__recv resp, $rmsg __result)
    }};
    ($rpc:expr, $smsg:ident($($a:expr),*) => $rmsg:ident) => {{
        let resp = send_recv!(__send $rpc, $smsg, $($a),*);
        send_recv!(__recv resp, $rmsg)
    }};
    ($rpc:expr, $smsg:ident($($a:expr),*) => $rmsg:ident()) => {{
        let resp = send_recv!(__send $rpc, $smsg, $($a),*);
        send_recv!(__recv resp, $rmsg __result)
    }};
    //
    (__send $rpc:expr, $smsg:ident) => ({
        $rpc.call(ServerMessage::$smsg)
    });
    (__send $rpc:expr, $smsg:ident, $($a:expr),*) => ({
        $rpc.call(ServerMessage::$smsg($($a),*))
    });
    (__recv $resp:expr, $rmsg:ident) => ({
        match $resp {
            Ok(ClientMessage::$rmsg) => Ok(()),
            Ok(ClientMessage::Error(e)) => Err($crate::send_recv::_err(e)),
            Ok(m) => {
                debug!("received wrong message - got={:?}", m);
                Err($crate::send_recv::_err(None))
            },
            Err(e) => {
                debug!("received error from rpc - got={:?}", e);
                Err($crate::send_recv::_err(None))
            },
        }
    });
    (__recv $resp:expr, $rmsg:ident __result) => ({
        match $resp {
            Ok(ClientMessage::$rmsg(v)) => Ok(v),
            Ok(ClientMessage::Error(e)) => Err($crate::send_recv::_err(e)),
            Ok(m) => {
                debug!("received wrong message - got={:?}", m);
                Err($crate::send_recv::_err(None))
            },
            Err(e) => {
                debug!("received error - got={:?}", e);
                Err($crate::send_recv::_err(None))
            },
        }
    })
}