jsoncall 0.0.3

A simple asynchronous JSON-RPC 2.0 library leveraging Rust's type system
Documentation
use jsoncall::{
    Handler, NO_PARAMS, Params, RequestContext, Response, Result, Session, SessionOptions,
    SessionResult, bail, bail_public,
};
use tokio::test;

fn make_channel(expose_internals: Option<bool>) -> (Session, Session) {
    Session::new_channel(
        BailService,
        BailService,
        &SessionOptions { expose_internals },
    )
}
struct BailService;

impl Handler for BailService {
    fn request(&mut self, method: &str, _params: Params, cx: RequestContext) -> Result<Response> {
        if method == "bail" {
            bail!("aaa");
        }
        if method == "bail_public" {
            bail_public!(_, "bbb");
        }
        cx.method_not_found()
    }
}

#[test]
async fn expose_internals_default() {
    let (client, _server) = make_channel(None);
    let ret: SessionResult<()> = client.request("bail", NO_PARAMS).await;
    let e = ret.unwrap_err();
    let msg = e.to_string();
    assert_eq!(msg.contains("aaa"), cfg!(debug_assertions), "{msg}");
}

#[test]
async fn expose_internals_false() {
    let (client, _server) = make_channel(Some(false));
    let ret: SessionResult<()> = client.request("bail", NO_PARAMS).await;
    let e = ret.unwrap_err();
    assert!(!e.to_string().contains("aaa"), "{e}");
}

#[test]
async fn expose_internals_true() {
    let (client, _server) = make_channel(Some(true));
    let ret: SessionResult<()> = client.request("bail", NO_PARAMS).await;
    let e = ret.unwrap_err();
    assert!(e.to_string().contains("aaa"), "{e}");
}