use crate::{
server_tls::ServerTls,
tls::{Tls, parse_url},
};
use clap::Parser;
use clap_verbosity_flag::Verbosity;
use colored::Colorize;
use std::{fmt::Debug, io::Write};
use trillium_logger::Logger;
use trillium_proxy::{Client, Proxy, Url};
use trillium_static::StaticFileHandler;
mod root_path;
use root_path::RootPath;
#[derive(Parser, Debug)]
pub struct StaticCli {
#[arg(default_value_t)]
root: RootPath,
#[arg(short = 'o', long, env, default_value = "localhost")]
host: String,
#[arg(short, long, env, default_value = "8080")]
port: u16,
#[command(flatten)]
server_tls: ServerTls,
#[arg(short, long, env = "FORWARD", value_parser = parse_url)]
forward: Option<Url>,
#[arg(short, long, env)]
index: Option<String>,
#[command(flatten)]
verbose: Verbosity,
}
impl StaticCli {
pub fn run(self) {
env_logger::Builder::new()
.parse_filters(&format!(
"{},quinn=off,quinn_proto=off",
self.verbose.log_level_filter()
))
.format(|buf, record| {
writeln!(
buf,
"[{}] {}",
record.module_path().unwrap_or_default().dimmed(),
record.args()
)
})
.init();
let path = self.root.clone();
let mut static_file_handler = StaticFileHandler::new(path);
if let Some(index) = &self.index {
static_file_handler = static_file_handler.with_index_file(index);
}
let server = (
Logger::new(),
self.forward
.clone()
.map(|url| Proxy::new(Client::from(Tls::default()), url)),
static_file_handler,
);
let config = trillium_smol::config()
.with_port(self.port)
.with_host(&self.host);
self.server_tls.run_with_tls(config, server);
}
}