pub mod config;
mod server_impl;
mod worker;
use anyhow::Result;
use std::path::PathBuf;
pub use config::Config;
pub use server_impl::Server;
pub use worker::Worker;
pub fn run_with_config(
ip: String,
port: u16,
path: PathBuf,
read_only: bool,
single_port: bool,
config: Option<Config>,
) -> Result<()> {
let server_config = config.unwrap_or_default();
let config = server_config.merge_cli(ip, port, path, read_only, single_port);
let ip = config.ip.as_deref().unwrap_or("0.0.0.0");
let port = config.port.unwrap_or(69);
let directory = config
.directory
.clone()
.unwrap_or_else(|| PathBuf::from("."));
let read_only = config.read_only.unwrap_or(false);
let single_port = config.single_port.unwrap_or(false);
log::info!("Starting TFTP server on {}:{}", ip, port);
log::info!("Read-only mode: {}", read_only);
log::info!("Single port mode: {}", single_port);
if !directory.exists() {
log::error!("Directory does not exist: {}", directory.display());
return Err(anyhow::anyhow!("Directory does not exist"));
}
let mut server = Server::new(&config)?;
log::info!("TFTP server listening, press Ctrl+C to stop");
server.listen();
Ok(())
}