summaryrefslogtreecommitdiffstats
path: root/CLI/rust/src/game_of_life/generators
diff options
context:
space:
mode:
Diffstat (limited to 'CLI/rust/src/game_of_life/generators')
-rw-r--r--CLI/rust/src/game_of_life/generators/input.rs75
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