use std::path::PathBuf;
use std::time::Duration;
use kindling_server::{serve, ServerConfig};
use crate::cli::ServeArgs;
use crate::{runtime, CliError, CliResult};
pub fn run(args: ServeArgs) -> CliResult {
let config = build_config(&args)?;
if !args.daemonize {
println!("Starting kindling daemon...");
println!("Socket: {}", config.socket_path.display());
println!("kindling home: {}", config.kindling_home.display());
println!("Idle timeout: {}s", config.idle_timeout.as_secs());
println!();
}
runtime()?.block_on(async { serve(config).await })?;
Ok(())
}
fn build_config(args: &ServeArgs) -> Result<ServerConfig, CliError> {
let home = if let Some(home) = &args.kindling_home {
PathBuf::from(home)
} else if let Some(socket) = &args.socket {
PathBuf::from(socket)
.parent()
.map(Path::to_path_buf)
.unwrap_or_else(|| PathBuf::from("."))
} else {
kindling_store::default_kindling_home().ok_or_else(|| {
CliError::Invalid(
"could not determine kindling home (no HOME/USERPROFILE); pass --kindling-home"
.to_string(),
)
})?
};
let mut config = ServerConfig::new(home);
if let Some(socket) = &args.socket {
config.socket_path = PathBuf::from(socket);
}
config.idle_timeout = Duration::from_secs(args.idle_timeout);
Ok(config)
}
use std::path::Path;