Sesh ☕

Build Status

A library for deadlock-free session-typed communication in Rust.

```rust extern crate rand; extern crate sesh;

use rand::{Rng, thread_rng}; use sesh::*; use std::boxed::Box; use std::error::Error;

type NegSrv = Recv>; type AddSrv = Recv>>; enum CalcOp { Neg(NegSrv), Add(AddSrv) }

type CalcSrv = Recv; type CalcCli = ::Dual;

fn server(s: CalcSrv) -> Result<(), Box> { offer!(s, { CalcOp::Neg(s) => { let (x, s) = recv(s)?; let s = send(-x, s); close(s)?; Ok(()) }, CalcOp::Add(s) => { let (x, s) = recv(s)?; let (y, s) = recv(s)?; let s = send(x.wrapping_add(y), s); close(s)?; Ok(()) }, }) }

[test]

fn server_works() { assert!(|| -> Result<(), Box> {

    // Pick some random numbers.
    let mut rng = thread_rng();

    // Test the negation function.
    {
        let s: CalcCli = fork(server);
        let x: i64 = rng.gen();
        let s = choose!(CalcOp::Neg, s);
        let s = send(x, s);
        let (y, s) = recv(s)?;
        close(s)?;
        assert_eq!(-x, y);
    }

    // Test the addition function.
    {
        let s: CalcCli = fork(server);
        let x: i64 = rng.gen();
        let y: i64 = rng.gen();
        let s = choose!(CalcOp::Add, s);
        let s = send(x, s);
        let s = send(y, s);
        let (z, s) = recv(s)?;
        close(s)?;
        assert_eq!(x.wrapping_add(y), z);
    }

    Ok(())

}().is_ok());

} ```