aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbreezystatic772025-01-26 12:42:38 -0500
committerbreezystatic772025-01-26 12:42:38 -0500
commitbab2534bef10314f2b06cdf52ec3766350312c17 (patch)
tree3dc36dba77f5a08687427ec6393c9bf10e2cd471
parente3b460ee74f0e6512f676dfbc814f219ee41c5c9 (diff)
add more flags
-rw-r--r--src/main.rs73
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 {