peak refactoring.

- main method was too complex
- now its better, **to read**
This commit is contained in:
2025-07-23 23:22:25 +02:00
parent 01f3de7f3b
commit 795ae64aa2
4 changed files with 52 additions and 31 deletions

View File

@@ -3,7 +3,9 @@
<component name="MaterialThemeProjectNewConfig">
<option name="metadata">
<MTProjectMetadataState>
<option name="userId" value="2d7a3dd6:1982d440666:-7ff2" />
<option name="migrated" value="true" />
<option name="pristineConfig" value="false" />
<option name="userId" value="25433ed1:19828f6ea6b:-7ffe" />
</MTProjectMetadataState>
</option>
</component>

View File

@@ -10,6 +10,7 @@
<body>
<h1 class="specialboi">Hello from RSTTP</h1>
<h2 style="font-style: italic;font-weight: bold;">Special Heading2</h2>
<p id="javascriptdate">
<p>
<script src="script.js"></script>

View File

@@ -3,7 +3,7 @@ document.addEventListener("DOMContentLoaded", () => {
function updateDateTime() {
const now = new Date();
dateElement.textContent = `Current date and time: ${now.toLocaleString()}`;
dateElement.textContent = `Current date and time: ${now}`;
}
// Update once on load

View File

@@ -258,59 +258,68 @@ async fn run_server(
}
}
#[derive(Clone)]
struct ServerConfig {
address: String,
base_path: Arc<PathBuf>,
cache: Arc<RwLock<FileCache>>,
stats: Arc<ServerStats>,
}
#[tokio::main]
async fn main() -> io::Result<()> {
let args: Vec<String> = std::env::args().collect();
let config = parse_arguments()?;
let server_handle = spawn_server(config.clone());
run_interface(config, server_handle).await
}
fn parse_arguments() -> io::Result<ServerConfig> {
let args: Vec<String> = std::env::args().collect();
if args.len() < 4 {
eprintln!("Usage: {} <address> <port> <path_to_serve>", args[0]);
std::process::exit(1);
}
let address = &args[1];
let port = &args[2];
let path = Path::new(&args[3]);
if !path.exists() || !path.is_dir() {
eprintln!("Error: The specified path does not exist or is not a directory");
std::process::exit(1);
}
let base_path = Arc::new(path.canonicalize()?);
let bind_addr = format!("{}:{}", address, port);
let cache = Arc::new(RwLock::new(FileCache::new(3600)));
let stats = Arc::new(ServerStats::new());
let bind_addr = format!("{}:{}", &args[1], &args[2]);
// Spawn the server in a separate task
let server_stats = Arc::clone(&stats);
let server_cache = Arc::clone(&cache);
let server_base_path = Arc::clone(&base_path);
let server_addr = bind_addr.clone();
Ok(ServerConfig {
address: bind_addr,
base_path: Arc::new(path.canonicalize()?),
cache: Arc::new(RwLock::new(FileCache::new(3600))),
stats: Arc::new(ServerStats::new()),
})
}
let server_handle = tokio::spawn(async move {
fn spawn_server(config: ServerConfig) -> tokio::task::JoinHandle<io::Result<()>> {
tokio::spawn(async move {
run_server(
server_addr,
server_base_path,
server_cache,
server_stats,
config.address,
config.base_path,
config.cache,
config.stats,
).await
});
})
}
// Initialize and run TUI
async fn run_interface(
config: ServerConfig,
server_handle: tokio::task::JoinHandle<io::Result<()>>,
) -> io::Result<()> {
let mut tui = Tui::new()?;
let mut background = false;
while !background {
match tui.run(Arc::clone(&stats), bind_addr.clone()) {
match tui.run(Arc::clone(&config.stats), config.address.clone()) {
Ok(true) => background = true, // Ctrl+B pressed
Ok(false) => {
// Check for Ctrl+C or continue
if event::poll(std::time::Duration::from_millis(100))? {
if let Event::Key(key) = event::read()? {
if key.code == KeyCode::Char('c') && key.modifiers == KeyModifiers::CONTROL {
break;
}
}
if should_exit()? {
break;
}
}
Err(e) => {
@@ -327,3 +336,12 @@ async fn main() -> io::Result<()> {
Ok(())
}
fn should_exit() -> io::Result<bool> {
if event::poll(std::time::Duration::from_millis(100))? {
if let Event::Key(key) = event::read()? {
return Ok(key.code == KeyCode::Char('c') && key.modifiers == KeyModifiers::CONTROL);
}
}
Ok(false)
}