From 78d050a3b45c88d3fe3b79631a708e1ae400747c Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Fri, 2 Sep 2016 08:17:40 +0200 Subject: [PATCH] Allow to specify spread, freq, and seed as arguments. --- Cargo.lock | 6 +++++ Cargo.toml | 1 + src/main.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a59816..eabd7c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,6 +3,7 @@ name = "loldog" version = "0.1.0" dependencies = [ "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -11,6 +12,11 @@ name = "ansi_term" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "getopts" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index bb4e187..005a9a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,5 +4,6 @@ version = "0.1.0" authors = ["logaritmisk "] [dependencies] +getopts = "0.2" rand = "0.3" ansi_term = "0.9" diff --git a/src/main.rs b/src/main.rs index d644612..24f2818 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,20 +1,84 @@ +extern crate getopts; extern crate rand; extern crate ansi_term; use std::io; use std::io::prelude::*; use std::f32::consts::PI; +use std::env; +use getopts::Options; use rand::{thread_rng, Rng}; use ansi_term::Colour::RGB; +fn print_usage(program: &str, opts: Options) { + let brief = format!("Usage: {} [OPTION]... [FILE]...", program); + + print!("{}", opts.usage(&brief)); +} + fn main() { - let mut s = 1.0; // thread_rng().gen_range(0.0, 256.0); + let args: Vec = env::args().collect(); + let program = args[0].clone(); + + let mut opts = Options::new(); + + opts.optopt("p", "spread", "Rainbow spread", ""); + opts.optopt("F", "freq", "Rainbow frequency", ""); + opts.optopt("S", "seed", "Rainbow seed, 0 = random", ""); + opts.optflag("h", "help", "Show this message"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => { m } + Err(f) => { panic!(f.to_string()) } + }; + + if matches.opt_present("h") { + print_usage(&program, opts); + + return; + } + + // @todo this is nasty... fix this. + let spread : f32 = match matches.opt_default("spread", "3.0") { + Some(s) => { + match s.parse() { + Ok(0.0) => 3.0, + Ok(n) => n, + _ => 3.0 + } + }, + None => 3.0 + }; + + // @todo this is nasty... fix this. + let freq : f32 = match matches.opt_default("freq", "0.1") { + Some(s) => { + match s.parse() { + Ok(0.0) => 0.1, + Ok(n) => n, + _ => 0.1 + } + }, + None => 0.1 + }; + + // @todo this is nasty... fix this. + let mut seed : i32 = match matches.opt_default("seed", "0") { + Some(s) => { + match s.parse() { + Ok(0) => thread_rng().gen_range(0, 256), + Ok(n) => n, + _ => thread_rng().gen_range(0, 256) + } + }, + None => thread_rng().gen_range(0, 256) + }; let stdin = io::stdin(); for line in stdin.lock().lines() { - s += 1.0; + seed += 1; let mut d = 0; @@ -24,7 +88,7 @@ fn main() { _ => 1 }; - let (red, green, blue) = rainbow(0.1, (s + d as f32) / 3.0); + let (red, green, blue) = rainbow(freq, (seed + d) as f32 / spread); print!("{}", RGB(red, green, blue).paint(c.to_string())); }