Files
clide/src/main.rs

66 lines
2.3 KiB
Rust
Raw Normal View History

2026-01-25 20:57:36 +00:00
use crate::tui::Tui;
use anyhow::{Context, Result};
use clap::Parser;
use log::{info, trace};
use std::process::{Command, Stdio};
2025-03-29 08:01:13 -04:00
2026-01-25 20:57:36 +00:00
pub mod gui;
pub mod tui;
/// Extendable command-line driven development environment written in Rust using the Qt UI framework.
/// If no flags are provided, the GUI editor is launched in a separate process.
/// If no path is provided, the current directory is used.
#[derive(Parser, Debug)]
#[structopt(name = "clide", verbatim_doc_comment)]
struct Cli {
/// The root directory for the project to open with the clide editor.
#[arg(value_parser = clap::value_parser!(std::path::PathBuf))]
pub path: Option<std::path::PathBuf>,
2025-03-29 08:01:13 -04:00
2026-01-25 20:57:36 +00:00
/// Run clide in headless mode.
#[arg(value_name = "tui", short, long)]
pub tui: bool,
2025-03-29 08:01:13 -04:00
2026-01-25 20:57:36 +00:00
/// Run the clide GUI in the current process, blocking the terminal and showing all output streams.
#[arg(value_name = "gui", short, long)]
pub gui: bool,
2025-03-29 08:01:13 -04:00
}
2026-01-25 20:57:36 +00:00
fn main() -> Result<()> {
let args = Cli::parse();
2025-03-29 08:01:13 -04:00
2026-01-25 20:57:36 +00:00
let root_path = match args.path {
// If the CLI was provided a directory, convert it to absolute.
Some(path) => std::path::absolute(path)?,
// If no path was provided, use the current directory.
None => std::env::current_dir().unwrap_or(
// If we can't find the CWD, attempt to open the home directory.
dirs::home_dir().context("Failed to obtain home directory")?,
),
};
info!(target:"main()", "Root path detected: {root_path:?}");
2025-03-29 08:01:13 -04:00
2026-01-25 20:57:36 +00:00
match args.gui {
true => {
trace!(target:"main()", "Starting GUI");
gui::run(root_path)
2025-03-29 08:01:13 -04:00
}
2026-01-25 20:57:36 +00:00
false => match args.tui {
// Open the TUI editor if requested, otherwise use the QML GUI by default.
true => {
trace!(target:"main()", "Starting TUI");
Ok(Tui::new(root_path)?.start()?)
}
false => {
trace!(target:"main()", "Starting GUI in a new process");
Command::new(std::env::current_exe()?)
.args(&["--gui", root_path.to_str().unwrap()])
.stdout(Stdio::null())
.stderr(Stdio::null())
.stdin(Stdio::null())
.spawn()?;
Ok(())
}
},
2025-03-29 08:01:13 -04:00
}
}