#![allow(deprecated)]
use std::{sync::atomic::AtomicBool, panic::{UnwindSafe, catch_unwind}};
use anyhow::{Result, Error};
use crate::{Window, NCurseswWinError, ncurses::ncurses::NCurses};
lazy_static! {
pub(in crate) static ref INITSCR_CALLED: AtomicBool = AtomicBool::new(false);
pub(in crate) static ref COLOR_STARTED: AtomicBool = AtomicBool::new(false);
}
pub fn ncursesw_entry<F: FnOnce(&Window) -> Result<T> + UnwindSafe, T>(func: F) -> Result<T> {
match ncursesw_init(|stdscr| {
match func(stdscr) {
Err(source) => Ok(Err(source)),
Ok(value) => Ok(Ok(value))
}
}).unwrap_or_else(|source| Err(match source {
Some(message) => NCurseswWinError::Panic { message },
None => NCurseswWinError::Panic { message: "There was a panic, but no message!".to_string() }
})) {
Err(source) => Err(Error::new(source)),
Ok(result) => result
}
}
#[deprecated(since = "0.3.0", note = "Use ncursesw_entry() instead")]
pub fn ncursesw_init<F: FnOnce(&Window) -> R + UnwindSafe, R>(func: F) -> Result<R, Option<String>> {
catch_unwind(|| {
let ncurses = match NCurses::new() {
Err(_) => panic!("ncursesw::initscr() has failed!"),
Ok(handle) => handle
};
func(&ncurses.stdscr())
}).map_err(|source| match source.downcast_ref::<&str>() {
Some(andstr) => Some((*andstr).to_string()),
None => source.downcast_ref::<String>().map(|string| string.to_string())
})
}
pub fn safe_entry<F: FnOnce() -> Result<T> + UnwindSafe, T>(func: F) -> Result<T> {
match safe_init(|| {
match func() {
Err(source) => Ok(Err(source)),
Ok(value) => Ok(Ok(value))
}
}).unwrap_or_else(|source| Err(match source {
Some(message) => NCurseswWinError::Panic { message },
None => NCurseswWinError::Panic { message: "There was a panic, but no message!".to_string() }
})) {
Err(source) => Err(Error::new(source)),
Ok(result) => result
}
}
fn safe_init<F: FnOnce() -> R + UnwindSafe, R>(func: F) -> Result<R, Option<String>> {
catch_unwind(|| {
func()
}).map_err(|source| match source.downcast_ref::<&str>() {
Some(andstr) => Some((*andstr).to_string()),
None => source.downcast_ref::<String>().map(|string| string.to_string())
})
}