summaryrefslogtreecommitdiffhomepage
path: root/mullvad-cli/src/rpc.rs
blob: 7397e822c4c109a5e41f2841de79b9bcaef325c7 (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
use {Result, ResultExt};
use serde;
use std::fs::File;
use std::io::Read;
use talpid_ipc::WsIpcClient;

pub fn call<T, O>(method: &str, args: &T) -> Result<O>
    where T: serde::Serialize,
          O: for<'de> serde::Deserialize<'de>
{
    call_internal(method, args).chain_err(|| "Unable to call backend over RPC")
}

pub fn call_internal<T, O>(method: &str, args: &T) -> Result<O>
    where T: serde::Serialize,
          O: for<'de> serde::Deserialize<'de>
{
    let address = read_rpc_address()?;
    info!("Using RPC address {}", address);
    let mut rpc_client = WsIpcClient::new(address)
        .chain_err(|| "Unable to create RPC client")?;
    rpc_client.call(method, args).chain_err(|| format!("Unable to call RPC method {}", method))
}

fn read_rpc_address() -> Result<String> {
    let path = ::std::env::temp_dir().join(".mullvad_rpc_address");

    debug!("Trying to read RPC address at {}", path.to_string_lossy());
    let mut address = String::new();
    if let Ok(_) = File::open(path).and_then(|mut file| file.read_to_string(&mut address)) {
        return Ok(address);
    }
    bail!("Unable to read RPC address");
}