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(-)

(limited to 'src')

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 {
-- 
cgit v1.2.3