From bab2534bef10314f2b06cdf52ec3766350312c17 Mon Sep 17 00:00:00 2001 From: breezystatic77 Date: Sun, 26 Jan 2025 12:42:38 -0500 Subject: add more flags --- src/main.rs | 73 +++++++++++++++++++++++++++++++++++++++++-------------------- 1 file 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, } #[tokio::main] @@ -123,13 +136,13 @@ impl Service> for RandomPageService { } } -const PARAGRAPH_WORDS: RangeInclusive = 10..=200; -const N_LINKS: RangeInclusive = 3..=10; - #[derive(Debug)] struct PageGenerator { seed: String, segments: u8, + href_prefix: Option, + paragraph_size: RangeInclusive, + n_links: RangeInclusive, delay: RangeInclusive, 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::(); let avg_paragraph_words = - BigFloat::from_usize(PARAGRAPH_WORDS.sum::()).unwrap() - / BigFloat::from_usize(PARAGRAPH_WORDS.count()).unwrap(); + BigFloat::from_u16(self.paragraph_size.clone().sum::()) + / 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!("

{}

", link)) .collect::>() - .join("\n"); + .join(""); tracing::info!(route, delay); Ok(format!( - r#" - - - - -

{}

- {} - - - "#, - random_paragraph, random_links, + "\ + \ + \ + {page_title}\ + \ + \ + \ + \ + \ +

{random_paragraph}

\ + {random_links}\ + \ + ", )) } fn random_route_link(&self, rng: &mut Pcg64) -> String { -- cgit v1.2.3