fireworks 1.0.4

A fun display of fireworks in the terminal
use clap::{App, Arg};
use firework::types::Drawables;
use rand::Rng;
use std::{
  io::{stdout, Error},
  process::exit,
  sync::{
    mpsc,
    mpsc::{Receiver, Sender, SyncSender},
  },
};
use termion::raw::IntoRawMode;

mod compositor;
pub mod firework;
mod input;
mod renderer;

fn main() -> Result<(), Error> {
  let matches = App::new("Fireworks")
    .version("1.0.4")
    .author("Darrien Glasser <me@darrien.dev>")
    .about("A fun terminal fireworks display")
    .arg(
      Arg::with_name("seed")
        .short("s")
        .long("seed")
        .takes_value(true)
        .help("set custom random seed"),
    )
    .get_matches();

  let seed = if let Some(i) = matches.value_of("seed") {
    i.parse::<u64>().unwrap_or_else(|_| {
      eprintln!("Must be a valid number: {}", i);
      exit(1);
    })
  } else {
    rand::thread_rng().gen_range(0, u64::MAX)
  };

  let (input_sender_1, input_receiver_1): (Sender<bool>, Receiver<bool>) = mpsc::channel();
  let (input_sender_2, input_receiver_2): (Sender<bool>, Receiver<bool>) = mpsc::channel();

  let (regen_buffer_filler, regen_buffer): (SyncSender<Drawables>, Receiver<Drawables>) =
    mpsc::sync_channel(5);

  let mut stdout = stdout()
    .into_raw_mode()
    .expect("Unable to capture stdout. Exiting.");

  input::capture(vec![input_sender_1, input_sender_2]);
  compositor::start(seed, regen_buffer_filler, input_receiver_2);
  renderer::start(&mut stdout, regen_buffer, input_receiver_1);

  Ok(())
}