in src/vtok_tool/src/main.rs [103:147]
fn cmd_raw_rpc<I: Iterator<Item = String>>(mut arg_iter: I) -> Result<(), Error> {
let mut cli_opts = HashMap::new();
while let Some(word) = arg_iter.next() {
match word.as_str() {
"--server" => {
let addr = arg_iter
.next()
.ok_or(Error::UsageError(format!("invalid server addr")))
.and_then(|addr| parse_server_addr(addr.as_str()))?;
cli_opts.insert(word, CliOption::Server(addr));
}
_ => return Err(Error::UsageError(format!("unexpected argument: {}", word))),
}
}
let server_addr = match cli_opts.get("--server") {
Some(CliOption::Server(addr)) => addr,
_ => return Err(Error::UsageError(format!("missing server address"))),
};
fn do_raw_rpc<T: Transport>(mut transport: T) -> Result<(), Error> {
let request = serde_json::from_reader(std::io::stdin())
.map_err(|_| Error::UsageError(format!("Invalid RPC request")))?;
transport
.send_request(&request)
.map_err(Error::TransportError)?;
let response = transport.recv_response().map_err(Error::TransportError)?;
serde_json::to_writer(std::io::stdout(), &response).map_err(Error::SerdeError)?;
Ok(())
}
match server_addr {
ServerAddr::Unix(path) => UnixStream::connect(path)
.map_err(Error::IoError)
.map(|stream| HttpTransport::new(stream, schema::API_URL))
.and_then(|xport| do_raw_rpc(xport)),
ServerAddr::Vsock(addr) => VsockStream::connect(*addr)
.map_err(Error::IoError)
.map(|stream| HttpTransport::new(stream, schema::API_URL))
.and_then(|xport| do_raw_rpc(xport)),
}
}