textris 0.2.0

Tetris on terminal!
Documentation
extern crate termion;
extern crate textris;

use std::{env, io, process};
use termion::input::TermRead;
use termion::raw::IntoRawMode;
use textris::cli::{self, CliParsed, Config};
use textris::game::Game;
use textris::inputs::Inputs;
use textris::screen::Screen;

enum Exit {
    Ok,
    Err(i32),
}

impl Exit {
    pub fn code(&self) -> i32 {
        match self {
            Exit::Ok => 0,
            Exit::Err(n) => *n,
        }
    }
}

fn main() {
    let args: Vec<String> = env::args().collect();
    let exit_code = match cli::parse_args(&args) {
        Ok(parsed) => match parsed {
            CliParsed::Help(msg) => {
                println!("{}", msg);
                Exit::Ok
            }
            CliParsed::Run(config) => run(config),
        },
        Err(err) => {
            println!("ERR: {}", err);
            for e in err.iter_causes() {
                println!("  {}", e);
            }
            Exit::Err(1)
        }
    };
    process::exit(exit_code.code());
}

fn run(conf: Config) -> Exit {
    let stdout = io::stdout();
    let stdout = stdout.lock().into_raw_mode().unwrap();

    let inputs = Inputs::new(io::stdin().events(), conf.key());
    let screen = Screen::new(stdout);
    let mut game = Game::new(inputs, screen);

    match game.start() {
        Ok(_) => Exit::Ok,
        Err(err) => {
            game.stop_by_error(err);
            Exit::Err(1)
        }
    }
}