cargo hollywood
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..4e89d88
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,95 @@
+use std::path::PathBuf;
+
+use anyhow::Result;
+use clap::Parser;
+use crossterm::{
+ event::{DisableMouseCapture, EnableMouseCapture},
+ execute,
+ terminal::{
+ disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, SetTitle,
+ },
+};
+use log::Level as RLevel;
+use ratatui::prelude::*;
+mod cargo;
+mod logger;
+mod test;
+
+#[derive(Parser)]
+/// Kewl cargo addon for dashboards
+struct Args {
+ #[arg(short = 'C')]
+ /// Change to DIRECTORY before doing anything
+ directory: Option<PathBuf>,
+ #[arg(short = 'l')]
+ /// Log to LOG_FILE
+ log_file: Option<PathBuf>,
+ #[arg(default_value = "trace", long = "level")]
+ log_level: Level,
+}
+
+#[repr(usize)]
+#[derive(clap::ValueEnum, Clone, Copy)]
+enum Level {
+ Error = 1,
+ Warn,
+ Info,
+ Debug,
+ Trace,
+}
+
+impl From<Level> for RLevel {
+ fn from(value: Level) -> Self {
+ // SAFETY: same
+ unsafe { std::mem::transmute(value) }
+ }
+}
+macro_rules! ctext {
+ ($fmt:literal $(, $arg:expr)* $(,)?) => {
+ <String as ansi_to_tui::IntoText>::into_text(&comat::cformat!($fmt $(, $arg)*)).expect("WHAT")
+ };
+}
+use ctext;
+
+fn main() -> Result<()> {
+ let args = if std::env::args().next().unwrap().contains(".cargo/bin") {
+ Args::parse_from(std::env::args().skip(1))
+ } else {
+ Args::parse()
+ };
+ if let Some(log) = args.log_file {
+ logger::Logger::init(args.log_level.into(), log);
+ }
+ log::info!("startup");
+ let mut stdout = std::io::stdout();
+ let meta = cargo::meta(
+ args.directory
+ .as_deref()
+ .unwrap_or(&std::env::current_dir()?),
+ )?;
+
+ enable_raw_mode()?;
+ execute!(
+ stdout,
+ EnableMouseCapture,
+ EnterAlternateScreen,
+ SetTitle("testing")
+ )?;
+ let backend = CrosstermBackend::new(stdout);
+ let mut terminal = Terminal::new(backend)?;
+ let h = std::panic::take_hook();
+ std::panic::set_hook(Box::new(move |panic| {
+ disable_raw_mode().unwrap();
+ execute!(std::io::stdout(), DisableMouseCapture, LeaveAlternateScreen).unwrap();
+ h(panic);
+ }));
+ let res = test::run(&mut terminal, args.directory.as_deref(), &meta);
+ disable_raw_mode()?;
+ execute!(
+ terminal.backend_mut(),
+ DisableMouseCapture,
+ LeaveAlternateScreen
+ )?;
+ terminal.show_cursor()?;
+ res
+}