Documentation
extern crate wamp;
extern crate eventual;
#[macro_use]
extern crate log;
extern crate env_logger;

use wamp::client::Connection;
use wamp::{URI, Value, Dict, List, CallResult, ArgList};
use std::io;
use eventual::Async;

fn addition_callback(args: List, _kwargs: Dict) -> CallResult<(Option<List>, Option<Dict>)> {
    info!("Performing addition");
    try!(args.verify_len(2));
    let a = try!(args.get_int(0)).unwrap();
    let b = try!(args.get_int(1)).unwrap();
    Ok((Some(vec![Value::Integer(a + b)]), None))
}

fn multiplication_callback(args: List, _kwargs: Dict) -> CallResult<(Option<List>, Option<Dict>)> {
    info!("Performing multiplication");
    try!(args.verify_len(2));
    let a = try!(args.get_int(0)).unwrap();
    let b = try!(args.get_int(1)).unwrap();
    Ok((Some(vec![Value::Integer(a * b)]), None))
}

fn echo_callback(args: List, kwargs: Dict) -> CallResult<(Option<List>, Option<Dict>)> {
    info!("Performing echo");
    Ok((Some(args), Some(kwargs)))
}

fn main() {
    env_logger::init().unwrap();
    let connection = Connection::new("ws://127.0.0.1:8090/ws", "realm1");
    info!("Connecting");
    let mut client = connection.connect().unwrap();

    info!("Connected");
    info!("Registering Addition Procedure");
    client.register(URI::new("ca.test.add"), Box::new(addition_callback)).unwrap().await().unwrap();

    info!("Registering Multiplication Procedure");
    let mult_reg = client.register(URI::new("ca.test.mult"), Box::new(multiplication_callback)).unwrap().await().unwrap();

    info!("Unregistering Multiplication Procedure");
    client.unregister(mult_reg).unwrap().await().unwrap();

    info!("Registering Echo Procedure");
    client.register(URI::new("ca.test.echo"), Box::new(echo_callback)).unwrap().await().unwrap();

    println!("Press enter to quit");
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    client.shutdown().unwrap().await().unwrap();
}