xml-rpc 0.1.0

Pure Rust implementation of XML-RPC
Documentation
extern crate serde;
extern crate xml_rpc;

use serde::{Deserialize, Serialize};

use std::{net, thread};
use xml_rpc::{Client, Fault, Server};

#[derive(Clone, Debug, Serialize, Deserialize)]
struct TestStruct {
    pub foo: i32,
    pub bar: String,
}

fn echo(v: TestStruct) -> Result<TestStruct, Fault> {
    Ok(v)
}

fn double(mut v: TestStruct) -> Result<TestStruct, Fault> {
    v.foo *= 2;
    v.bar = format!("{0}{0}", v.bar);
    Ok(v)
}

pub fn main() {
    let socket = net::SocketAddr::new(net::IpAddr::V4(net::Ipv4Addr::new(127, 0, 0, 1)), 8080);
    let mut server = Server::new();
    server.register_simple("echo", echo);
    server.register_simple("double", double);
    thread::spawn(move || {
        let bound_server = server.bind(&socket).unwrap();
        let socket = bound_server.local_addr();
        println!("{}", socket);
        bound_server.run()
    });
    let mut client = Client::new().unwrap();
    let req = TestStruct {
        foo: 42,
        bar: "baz".into(),
    };
    println!("Sending: {:?}", req);
    let uri = "http://localhost:8080/".parse().unwrap();
    let res: Result<Result<TestStruct, _>, _> = client.call(&uri, "echo", req.clone());
    println!("Echo Received: {:?}", res);
    let res: Result<Result<TestStruct, _>, _> = client.call(&uri, "double", req.clone());
    println!("Double Received: {:?}", res);
    let res: Result<Result<TestStruct, _>, _> = client.call(&uri, "invalid", req.clone());
    println!("Invalid Received: {:?}", res);
}