mod application;
mod fmt_helpers;
mod game_modes;
mod game_renderers;
mod gameplay_settings;
mod graphics_settings;
mod keybinds;
mod live_input_handler;
mod palette;
use std::{io, path::PathBuf};
use clap::Parser;
const CRATE_VERSION: &str = env!("CARGO_PKG_VERSION");
const CRATE_VERSION_MAJOR_MINOR: &str = {
let full_semver_str_bytes = CRATE_VERSION.as_bytes();
let mut dot_seen = false;
let mut i = 0;
loop {
if full_semver_str_bytes[i] == b'.' {
if dot_seen {
break;
} else {
dot_seen = true;
}
}
i += 1;
}
let Ok(the_str) = str::from_utf8(full_semver_str_bytes.split_at(i).0) else {
unreachable!()
};
the_str
};
fn savefile_name() -> String {
format!(".tetro-tui_v{CRATE_VERSION_MAJOR_MINOR}_savefile.json")
}
fn savefile_path() -> PathBuf {
dirs::config_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(savefile_name())
}
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
#[arg(short, long)]
seed: Option<u64>,
#[arg(short, long)]
board: Option<String>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();
let stdout = io::BufWriter::new(io::stdout());
let mut app = application::Application::with_savefile_and_cmdlineoptions(
stdout,
savefile_path(),
args.seed,
args.board,
);
std::panic::set_hook(Box::new(|panic_info| {
#[cfg(debug_assertions)]
{
let crash_file_name = format!(
"tetro-tui_v{CRATE_VERSION}_panic-info_{}.txt",
chrono::Utc::now().format("%Y-%m-%d_%Hh%Mm%Ss")
);
if let Ok(mut file) = std::fs::File::create(crash_file_name) {
use std::io::Write;
let _ = file.write(panic_info.to_string().as_bytes());
let _ = file.write(b"\n\n\n");
let _ = file.write(
std::backtrace::Backtrace::force_capture()
.to_string()
.as_bytes(),
);
}
}
let _ = crossterm::terminal::disable_raw_mode();
let _ =
crossterm::ExecutableCommand::execute(&mut io::stderr(), crossterm::style::ResetColor);
let _ = crossterm::ExecutableCommand::execute(&mut io::stderr(), crossterm::cursor::Show);
let _ = crossterm::ExecutableCommand::execute(
&mut io::stderr(),
crossterm::terminal::LeaveAlternateScreen,
);
eprint!("{panic_info}\n\n");
}));
app.run()?;
Ok(())
}