session_types 0.2.0

An implementation of session types in Rust
Documentation
#![feature(rand)]
#[macro_use]
extern crate session_types;
extern crate rand;

use std::thread::spawn;
use session_types::*;

type Igo = Choose<Send<String, Eps>, Send<u64, Eps>>;
type Ugo = Offer<Recv<String, Eps>, Recv<u64, Eps>>;

fn srv(chan_one: Chan<(), Ugo>, chan_two: Chan<(), Ugo>) {
    let _ign;
    chan_select! {
        _ign = chan_one.offer() => {
            String => {
                let (c, s) = chan_one.recv();
                assert_eq!("Hello, World!".to_string(), s);
                c.close();
                match chan_two.offer() {
                    Left(c) => c.recv().0.close(),
                    Right(c) => c.recv().0.close(),
                }
            },
            Number => {
                chan_one.recv().0.close();
                match chan_two.offer() {
                    Left(c) => c.recv().0.close(),
                    Right(c) => c.recv().0.close(),
                }
            }
        },
        _ign = chan_two.offer() => {
            String => {
                chan_two.recv().0.close();
                match chan_one.offer() {
                    Left(c) => c.recv().0.close(),
                    Right(c) => c.recv().0.close(),
                }
            },
            Number => {
                chan_two.recv().0.close();
                match chan_one.offer() {
                    Left(c) => c.recv().0.close(),
                    Right(c) => c.recv().0.close(),
                }
            }
        }
    }
}

fn cli(c: Chan<(), Igo>) {
    c.sel1().send("Hello, World!".to_string()).close();
}

fn main() {
    let (ca1, ca2) = session_channel();
    let (cb1, cb2) = session_channel();

    cb2.sel2().send(42).close();

    spawn(move|| cli(ca2));

    srv(ca1, cb1);
}