diff options
author | breezystatic77 | 2025-01-26 12:42:38 -0500 |
---|---|---|
committer | breezystatic77 | 2025-01-26 12:42:38 -0500 |
commit | bab2534bef10314f2b06cdf52ec3766350312c17 (patch) | |
tree | 3dc36dba77f5a08687427ec6393c9bf10e2cd471 | |
parent | e3b460ee74f0e6512f676dfbc814f219ee41c5c9 (diff) |
add more flags
-rw-r--r-- | src/main.rs | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/src/main.rs b/src/main.rs index ff25e91..352315b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,4 @@ use std::collections::HashSet; -use std::fmt::Display; use std::future::Future; use std::net::SocketAddr; use std::ops::RangeInclusive; @@ -40,8 +39,22 @@ struct Args { #[arg(long, default_value_t = 0)] delay_max: u64, /// maximum number of segments in a url path - #[arg(short, long, default_value_t = 6)] - segments: u8, + #[arg(long, default_value_t = 6)] + url_segments: u8, + /// minimum number of words in a paragraph + #[arg(long, default_value_t = 10)] + paragraph_min: u16, + /// maximum number of words in a paragraph + #[arg(long, default_value_t = 200)] + paragraph_max: u16, + /// minimum number of links on a page + #[arg(long, default_value_t = 3)] + links_min: u16, + /// maximum number of links on a page + #[arg(long, default_value_t = 10)] + links_max: u16, + #[arg(long)] + href_prefix: Option<String>, } #[tokio::main] @@ -123,13 +136,13 @@ impl Service<Request<hyper::body::Incoming>> for RandomPageService { } } -const PARAGRAPH_WORDS: RangeInclusive<usize> = 10..=200; -const N_LINKS: RangeInclusive<usize> = 3..=10; - #[derive(Debug)] struct PageGenerator { seed: String, segments: u8, + href_prefix: Option<String>, + paragraph_size: RangeInclusive<u16>, + n_links: RangeInclusive<u16>, delay: RangeInclusive<u64>, dict: Vec<&'static str>, dict_set: HashSet<&'static str>, @@ -142,7 +155,11 @@ impl PageGenerator { std::str::from_utf8(dictionary_data).unwrap(); PageGenerator { seed: args.seed.clone(), - segments: args.segments, + href_prefix: args.href_prefix.clone(), + segments: args.url_segments, + paragraph_size: args.paragraph_min + ..=(args.paragraph_max.max(args.paragraph_min)), + n_links: (args.links_min)..=(args.links_max.max(args.links_min)), delay: args.delay_min..=(args.delay_max.max(args.delay_min)), dict: dictionary_string.split_whitespace().collect(), dict_set: dictionary_string.split_whitespace().collect(), @@ -158,8 +175,8 @@ impl PageGenerator { .sum::<BigFloat>(); let avg_paragraph_words = - BigFloat::from_usize(PARAGRAPH_WORDS.sum::<usize>()).unwrap() - / BigFloat::from_usize(PARAGRAPH_WORDS.count()).unwrap(); + BigFloat::from_u16(self.paragraph_size.clone().sum::<u16>()) + / BigFloat::from_usize(self.paragraph_size.clone().count()).unwrap(); let avg_word_bytes = self .dict @@ -197,16 +214,22 @@ impl PageGenerator { let route = req.uri().path(); - for segment in route.split('/').filter(|v| v.len() > 0) { + for (i, segment) in route.split('/').filter(|v| v.len() > 0).enumerate() { if !self.dict_set.contains(segment) { return Err(("not found", StatusCode::NOT_FOUND)); } + tracing::debug!(i, segment); + if i >= self.segments as usize { + return Err(("not found", StatusCode::NOT_FOUND)); + } } + let page_title = route.replace('/', " ").trim().to_string(); + let mut rng: Pcg64 = Seeder::from(format!("{}---{}", self.seed, route)).make_rng(); - let n_words = rng.gen_range(PARAGRAPH_WORDS); - let n_links = rng.gen_range(N_LINKS); + let n_words = rng.gen_range(self.paragraph_size.clone()); + let n_links = rng.gen_range(self.n_links.clone()); let random_paragraph = (0..n_words) .map(|_| self.random_word(&mut rng)) @@ -217,22 +240,24 @@ impl PageGenerator { .map(|_| self.random_route_link(&mut rng)) .map(|link| format!("<p>{}</p>", link)) .collect::<Vec<String>>() - .join("\n"); + .join(""); tracing::info!(route, delay); Ok(format!( - r#" - <html> - <head> - </head> - <body> - <p>{}</p> - {} - </body> - </html> - "#, - random_paragraph, random_links, + "<!DOCTYPE html>\ + <html>\ + <head>\ + <title>{page_title}</title>\ + <meta property=\"og:title\" content=\"{page_title}\" />\ + <meta property=\"og:type\" content=\"article\" />\ + <meta property=\"og:locale\" content=\"en_US\" />\ + </head>\ + <body>\ + <p>{random_paragraph}</p>\ + {random_links}\ + </body>\ + </html>", )) } fn random_route_link(&self, rng: &mut Pcg64) -> String { |