From 5dcd0cf4dfd783c6f35591a53cda68434e417981 Mon Sep 17 00:00:00 2001 From: a14m Date: Tue, 6 Apr 2021 20:37:31 +0200 Subject: Add the URL generator w/testing --- CLI/rust/src/game_of_life/generators/input.rs | 75 ++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) (limited to 'CLI/rust/src') diff --git a/CLI/rust/src/game_of_life/generators/input.rs b/CLI/rust/src/game_of_life/generators/input.rs index a1bc234..26c0537 100644 --- a/CLI/rust/src/game_of_life/generators/input.rs +++ b/CLI/rust/src/game_of_life/generators/input.rs @@ -1,6 +1,7 @@ use crate::game_of_life::opts::Opts; use crate::game_of_life::universe::Universe; use clap::{Error, ErrorKind}; +use curl::easy::Easy; use regex::Regex; #[cfg(test)] @@ -132,8 +133,78 @@ mod generate_file_data { /// Reads a URL and parses it, converting alpha-numerical chars into living cells /// in a newly generated universe simulation #[cfg_attr(test, mockable)] -fn generate_url_data(_opts: Opts) -> Result { - unimplemented!() +fn generate_url_data(opts: Opts) -> Result { + let mut handle = Easy::new(); + let url = opts.input.clone().unwrap(); + let mut data = String::new(); + handle.url(&url).unwrap(); + { + let mut transfer = handle.transfer(); + + transfer + .write_function(|res| { + data = String::from_utf8(Vec::from(res)).unwrap(); + Ok(res.len()) + }) + .unwrap(); + + match transfer.perform() { + Ok(data) => data, + Err(e) => { + return Err(Error::with_description( + format!("{}\n", e.to_string()), + ErrorKind::Io, + )) + } + }; + }; + println!("{}", data); + Ok(populate(opts, data)) +} + +#[cfg(test)] +mod generate_url_data { + use super::*; + + fn opts(input: Option) -> Opts { + Opts { + input, + width: 4, + height: 3, + seed: 1337, + live_cell: 'L', + dead_cell: 'D', + delay: 13, + } + } + + #[test] + fn existing_url() { + let opts = opts(Some(String::from("https://example.com"))); + // + // + // + // Example Domain + // .... yada yada + let universe = generate_url_data(opts.clone()).unwrap(); + assert_eq!( + universe, + Universe { + opts, + future: vec![vec![false; 4]; 3], + current: vec![ + vec![false, false, true, true], //