json-rpc2 0.9.4

Simple, robust and pragmatic JSON-RPC 2.0 implementation
Documentation
use json_rpc2::*;
use serde_json::Value;

#[derive(Debug)]
struct ServiceData {
    pub message: String,
}

struct ServiceHandler;
impl Service for ServiceHandler {
    type Data = ServiceData;
    fn handle(
        &self,
        request: &mut Request,
        ctx: &Self::Data,
    ) -> Result<Option<Response>> {
        let mut response = None;
        if request.matches("hello") {
            let message = format!("Hello, {}!", &ctx.message);
            response = Some((request, Value::String(message)).into());
        }
        Ok(response)
    }
}

fn main() -> Result<()> {
    let service: Box<dyn Service<Data = ServiceData>> =
        Box::new(ServiceHandler {});
    let mut request = Request::new_reply("hello", None);
    let server = Server::new(vec![&service]);
    let data = ServiceData {
        message: "world".to_string(),
    };
    let response = server.serve(&mut request, &data);
    println!("{:?}", response.as_ref().unwrap().result());
    assert_eq!(
        Some(Value::String("Hello, world!".to_string())),
        response.unwrap().into()
    );
    Ok(())
}