use anyhow::Result;
use clap::Parser;
use console::style;
use tracing::info;
use forgex::Forge;
#[derive(Parser)]
pub struct RunCommand {
#[arg(short, long, default_value = "forge.toml")]
pub config: String,
#[arg(short, long)]
pub port: Option<u16>,
#[arg(long)]
pub host: Option<String>,
#[arg(long)]
pub dev: bool,
}
impl RunCommand {
pub async fn execute(self) -> Result<()> {
let log_level = if self.dev { "debug" } else { "info" };
tracing_subscriber::fmt()
.with_env_filter(std::env::var("RUST_LOG").unwrap_or_else(|_| log_level.to_string()))
.init();
println!();
println!(
" {} {} v{}",
style("⚒️").bold(),
style("FORGE").bold().cyan(),
env!("CARGO_PKG_VERSION")
);
println!();
let config_path = std::path::Path::new(&self.config);
if !config_path.exists() {
anyhow::bail!(
"Configuration file not found: {}\nRun `forge new` or `forge init` to create a project.",
self.config
);
}
info!("Loading configuration from {}", self.config);
let mut config = forge_core::config::ForgeConfig::from_file(&self.config)?;
if let Some(port) = self.port {
config.gateway.port = port;
}
let host = self.host.clone().unwrap_or_else(|| "127.0.0.1".to_string());
let port = config.gateway.port;
println!(
" {} Listening on {}",
style("🌐").bold(),
style(format!("http://{}:{}", host, port)).cyan()
);
println!(
" {} Dashboard at {}",
style("📊").bold(),
style(format!("http://{}:{}/_dashboard", host, port)).cyan()
);
if self.dev {
println!(" {} Development mode enabled", style("🔧").bold());
}
println!();
let forge = Forge::builder()
.config(config)
.build()
.map_err(|e| anyhow::anyhow!("{}", e))?;
forge.run().await.map_err(|e| anyhow::anyhow!("{}", e))?;
println!("\n {} Goodbye!", style("👋").bold());
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_run_command_defaults() {
let cmd = RunCommand {
config: "forge.toml".to_string(),
port: None,
host: None,
dev: false,
};
assert_eq!(cmd.config, "forge.toml");
assert!(!cmd.dev);
}
#[test]
fn test_run_command_with_overrides() {
let cmd = RunCommand {
config: "custom.toml".to_string(),
port: Some(3000),
host: Some("0.0.0.0".to_string()),
dev: true,
};
assert_eq!(cmd.config, "custom.toml");
assert_eq!(cmd.port, Some(3000));
assert_eq!(cmd.host, Some("0.0.0.0".to_string()));
assert!(cmd.dev);
}
}