diff options
Diffstat (limited to 'CLI/rust/src/game_of_life/generators/input.rs')
| -rw-r--r-- | CLI/rust/src/game_of_life/generators/input.rs | 75 |
1 files changed, 73 insertions, 2 deletions
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<Universe, Error> { - unimplemented!() +fn generate_url_data(opts: Opts) -> Result<Universe, Error> { + 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<String>) -> 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"))); + // <!doctype html> + // <html> + // <head> + // <title>Example Domain</title> + // .... 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], // <!do + vec![false, true, true, true], // <htm + vec![false, true, true, true], // <hea + ], + } + ) + } + + #[test] + fn non_existing_urls() { + assert!(generate_url_data(opts(Some(String::from("https://not-existing.com")),)).is_err()); + } } /// Return a universe struct with populated data from the data param |
