use std::{ptr, convert::TryFrom};
use crate::{
SCREEN, NCurseswError,
gen::{ColorType, ColorsType},
shims::{ncurses, ncurses::short_t},
normal::{ColorPair, Colors}
};
pub fn alloc_pair(colors: Colors) -> result!(ColorPair) {
assert!(colors.screen().is_none(), "alloc_pair() : colors.screen().is_some()");
let number = ncurses::alloc_pair(colors.foreground().number(), colors.background().number());
if number.is_negative() {
Err(ncurses_function_error_with_rc!("alloc_pair", number))
} else {
Ok(ColorPair::_from(None, short_t::try_from(number)?))
}
}
pub fn find_pair(colors: Colors) -> result!(Option<ColorPair>) {
assert!(colors.screen().is_none(), "find_pair() : colors.screen().is_some()");
let number = ncurses::find_pair(colors.foreground().number(), colors.background().number());
Ok(if number.is_negative() {
None
} else {
Some(ColorPair::_from(None, short_t::try_from(number)?))
})
}
pub fn alloc_pair_sp(screen: SCREEN, colors: Colors) -> result!(ColorPair) {
assert!(colors.screen().map_or_else(|| false, |colors_scr| ptr::eq(screen, colors_scr)), "alloc_pair_sp() : screen.is_null() || screen != colors.screen()");
let number = unsafe { ncurses::alloc_pair_sp(screen, colors.foreground().number(), colors.background().number()) };
if number.is_negative() {
Err(ncurses_function_error_with_rc!("alloc_pair_sp", number))
} else {
Ok(ColorPair::_from(Some(screen), short_t::try_from(number)?))
}
}
pub fn find_pair_sp(screen: SCREEN, colors: Colors) -> result!(Option<ColorPair>) {
assert!(colors.screen().map_or_else(|| false, |colors_scr| ptr::eq(screen, colors_scr)), "find_pair_sp() : screen.is_null() || screen != colors.screen()");
let number = unsafe { ncurses::find_pair_sp(screen, colors.foreground().number(), colors.background().number()) };
Ok(if number.is_negative() {
None
} else {
Some(ColorPair::_from(Some(screen), short_t::try_from(number)?))
})
}