use clap::Parser;
use periplon_sdk::tui::{AppConfig, TuiApp};
use std::path::PathBuf;
use std::process;
#[derive(Parser, Debug)]
#[command(
name = "dsl-tui",
version,
about = "Interactive TUI for DSL workflow management",
long_about = None
)]
struct Cli {
#[arg(short = 'd', long, value_name = "DIR", default_value = ".")]
workflow_dir: PathBuf,
#[arg(short = 'w', long, value_name = "FILE")]
workflow: Option<PathBuf>,
#[arg(short = 'r', long)]
readonly: bool,
#[arg(short = 't', long, value_name = "THEME", default_value = "dark")]
theme: String,
#[arg(short = 's', long, value_name = "DIR")]
state_dir: Option<PathBuf>,
#[arg(long)]
debug: bool,
#[arg(long, value_name = "MS", default_value = "250")]
tick_rate: u64,
}
#[tokio::main]
async fn main() {
let cli = Cli::parse();
if cli.debug {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("debug")).init();
log::info!("Debug logging enabled");
}
if !cli.workflow_dir.exists() {
eprintln!(
"Error: Workflow directory does not exist: {}",
cli.workflow_dir.display()
);
process::exit(1);
}
if let Some(ref workflow) = cli.workflow {
if !workflow.exists() {
eprintln!(
"Error: Workflow file does not exist: {}",
workflow.display()
);
process::exit(1);
}
}
let config = AppConfig {
workflow_dir: cli.workflow_dir.clone(),
workflow: cli.workflow.clone(),
readonly: cli.readonly,
theme: cli.theme.clone(),
state_dir: cli.state_dir.clone(),
debug: cli.debug,
tick_rate: cli.tick_rate,
};
log::info!("Starting DSL TUI");
log::info!("Workflow directory: {}", config.workflow_dir.display());
if config.readonly {
log::info!("Running in readonly mode");
}
match TuiApp::with_config(config) {
Ok(mut app) => {
if let Err(e) = app.run().await {
cleanup_terminal();
eprintln!("Application error: {}", e);
process::exit(1);
}
cleanup_terminal();
}
Err(e) => {
eprintln!("Failed to initialize TUI: {}", e);
process::exit(1);
}
}
}
fn cleanup_terminal() {
use crossterm::terminal::{disable_raw_mode, LeaveAlternateScreen};
use crossterm::ExecutableCommand;
use std::io;
let _ = io::stdout().execute(LeaveAlternateScreen);
let _ = disable_raw_mode();
}