use crate::terminal::TerminalState;
use ratatui::style::{Color, Modifier, Style};
use std::ffi::{c_void, CStr};
use std::os::raw::c_char;
pub(crate) fn state_mut<'a>(handle: *mut c_void) -> Option<&'a mut TerminalState> {
if handle.is_null() {
return None;
}
Some(unsafe { &mut *(handle as *mut TerminalState) })
}
pub(crate) fn state_ref<'a>(handle: *const c_void) -> Option<&'a TerminalState> {
if handle.is_null() {
return None;
}
Some(unsafe { &*(handle as *const TerminalState) })
}
pub(crate) fn cstr_to_string(ptr: *const c_char) -> String {
if ptr.is_null() {
return String::new();
}
unsafe { CStr::from_ptr(ptr).to_string_lossy().into_owned() }
}
pub(crate) fn slice_from<'a, T>(ptr: *const T, len: usize) -> &'a [T] {
if ptr.is_null() {
return &[];
}
unsafe { std::slice::from_raw_parts(ptr, len) }
}
pub(crate) fn slice_mut_from<'a, T>(ptr: *mut T, len: usize) -> Option<&'a mut [T]> {
if ptr.is_null() {
return None;
}
Some(unsafe { std::slice::from_raw_parts_mut(ptr, len) })
}
pub(crate) fn style_from_rgba(
fg_r: u8, fg_g: u8, fg_b: u8, use_default_fg: u8,
bg_r: u8, bg_g: u8, bg_b: u8, use_default_bg: u8,
modifiers: u8,
) -> Style {
let mut style = Style::default();
if use_default_fg == 0 { style = style.fg(Color::Rgb(fg_r, fg_g, fg_b)); }
if use_default_bg == 0 { style = style.bg(Color::Rgb(bg_r, bg_g, bg_b)); }
let mut modifier = Modifier::empty();
if modifiers & 0x01 != 0 { modifier |= Modifier::BOLD; }
if modifiers & 0x02 != 0 { modifier |= Modifier::ITALIC; }
if modifiers & 0x04 != 0 { modifier |= Modifier::UNDERLINED; }
if modifiers & 0x08 != 0 { modifier |= Modifier::DIM; }
if !modifier.is_empty() { style = style.add_modifier(modifier); }
style
}