use super::app::App;
fn which_gamba() -> Option<std::path::PathBuf> {
if let Ok(exe) = std::env::current_exe() {
if let Some(dir) = exe.parent() {
let sibling = dir.join("hidden");
if sibling.exists() {
return Some(sibling);
}
}
}
if let Ok(output) = std::process::Command::new("which")
.arg("hidden")
.output()
{
if output.status.success() {
let path = String::from_utf8_lossy(&output.stdout).trim().to_string();
if !path.is_empty() {
return Some(std::path::PathBuf::from(path));
}
}
}
std::env::var("HOME").ok()
.map(|h| std::path::PathBuf::from(h).join("Projects/GamblersDen/target/release/hidden"))
.filter(|p| p.exists())
}
impl App {
pub(crate) fn restore_terminal(&self) {
crossterm::terminal::enable_raw_mode().ok();
crossterm::execute!(
std::io::stdout(),
crossterm::terminal::EnterAlternateScreen
).ok();
}
pub(crate) fn launch_gamba(&mut self) -> std::result::Result<(), String> {
if self.gamba_child.is_some() {
return Err("🎰 Casino already running!".to_string());
}
let bin = which_gamba().ok_or_else(|| {
"🎰 Nothing to see here...".to_string()
})?;
crossterm::terminal::disable_raw_mode().ok();
crossterm::execute!(
std::io::stdout(),
crossterm::terminal::LeaveAlternateScreen
).ok();
match std::process::Command::new(&bin)
.stdin(std::process::Stdio::inherit())
.stdout(std::process::Stdio::inherit())
.stderr(std::process::Stdio::inherit())
.spawn()
{
Ok(child) => {
self.gamba_child = Some(child);
Ok(())
}
Err(e) => {
self.restore_terminal();
Err(format!("Failed to launch casino: {}", e))
}
}
}
pub(crate) fn reclaim_gamba(&mut self) -> Option<String> {
if let Some(mut child) = self.gamba_child.take() {
child.kill().ok();
child.wait().ok();
self.restore_terminal();
Some("🎰 Back from the casino. Response ready.".to_string())
} else {
None
}
}
pub(crate) fn check_gamba_exited(&mut self) -> Option<String> {
if let Some(ref mut child) = self.gamba_child {
match child.try_wait() {
Ok(Some(_status)) => {
self.gamba_child = None;
self.restore_terminal();
Some("🎰 Back from the casino. How'd you do, degen?".to_string())
}
_ => None,
}
} else {
None
}
}
}