use std::env;
use std::process::{Command, Stdio};
use std::path::Path;

#[derive(Debug)]
enum ProtobufError {
    IoError(::std::io::Error),
    Other
}

impl std::convert::From<::std::io::Error> for ProtobufError {
    fn from(e: ::std::io::Error) -> ProtobufError {
        ProtobufError::IoError(e)
    }
}

fn compile(prefix : &Path, files : &[&Path]) -> Result<(),ProtobufError>{
    let mut c = Command::new("protoc");
    c.arg("--rust_out").arg(env::var("OUT_DIR").unwrap())
        .arg("--proto_path").arg(prefix.to_str().unwrap());
    for f in files.iter() {
        c.arg(f.to_str().unwrap());
    }

    //c.stdout(Stdio::inherit());
    c.stderr(Stdio::inherit());

    let mut p = try!(c.spawn());
    let r = try!(p.wait());
    return match r.success() {
        true => Ok(()),
        false => Err(ProtobufError::Other),
    };
}

fn main() {
    let prefix = Path::new("protocol");
    compile(&prefix, &[
            &prefix.join("keyexchange.proto"),
            &prefix.join("authentication.proto")
    ]).unwrap();
}