use clap::Parser;
mod horde;
mod http_api;
mod http_ops;
mod rookery;
#[derive(Parser, Debug)]
#[clap(
author,
version,
about = "Kowalski server",
long_about = "Run the Kowalski HTTP API server used by the UI."
)]
struct Cli {
#[clap(long, default_value = "127.0.0.1:3456")]
bind: String,
#[clap(short, long)]
config: Option<String>,
#[clap(long)]
ollama_url: Option<String>,
#[clap(long, value_name = "PEM")]
tls_cert: Option<std::path::PathBuf>,
#[clap(long, value_name = "PEM")]
tls_key: Option<std::path::PathBuf>,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
let cli = Cli::parse();
let addr: std::net::SocketAddr = cli
.bind
.parse()
.map_err(|e| format!("Invalid --bind {:?}: {}", cli.bind, e))?;
let tls = match (cli.tls_cert, cli.tls_key) {
(Some(c), Some(k)) => Some((c, k)),
(None, None) => None,
_ => {
return Err("--tls-cert and --tls-key must be set together (or both omitted)".into());
}
};
http_api::serve(addr, cli.config, cli.ollama_url, tls).await?;
Ok(())
}