use std::{borrow::Cow, ffi::CStr, marker::PhantomData};
use weechat_sys::{t_gui_buffer, t_gui_nick_group, t_weechat_plugin};
use crate::{
buffer::{Buffer, Nick, NickSettings},
LossyCString, Weechat,
};
pub struct NickGroup<'a> {
pub(crate) ptr: *mut t_gui_nick_group,
pub(crate) buf_ptr: *mut t_gui_buffer,
pub(crate) weechat_ptr: *mut t_weechat_plugin,
pub(crate) buffer: PhantomData<&'a Buffer<'a>>,
}
impl<'a> NickGroup<'a> {
fn get_weechat(&self) -> Weechat {
Weechat::from_ptr(self.weechat_ptr)
}
fn get_string(&self, property: &str) -> Option<Cow<str>> {
let weechat = self.get_weechat();
let get_string = weechat.get().nicklist_group_get_string.unwrap();
let c_property = LossyCString::new(property);
let ret = unsafe { get_string(self.buf_ptr, self.ptr, c_property.as_ptr()) };
if ret.is_null() {
None
} else {
unsafe { Some(CStr::from_ptr(ret).to_string_lossy()) }
}
}
fn get_integer(&self, property: &str) -> i32 {
let weechat = self.get_weechat();
let get_integer = weechat.get().nicklist_group_get_integer.unwrap();
let c_property = LossyCString::new(property);
unsafe { get_integer(self.buf_ptr, self.ptr, c_property.as_ptr()) }
}
pub fn name(&self) -> Cow<str> {
self.get_string("name").unwrap()
}
pub fn color(&self) -> Cow<str> {
self.get_string("color").unwrap()
}
pub fn visible(&self) -> bool {
self.get_integer("visible") != 0
}
pub fn level(&self) -> u32 {
self.get_integer("level") as u32
}
pub fn add_nick(&self, nick_settings: NickSettings) -> Result<Nick, ()> {
let weechat = self.get_weechat();
let nick_ptr = Buffer::add_nick_helper(&weechat, self.buf_ptr, nick_settings, Some(self));
if nick_ptr.is_null() {
return Err(());
}
Ok(Nick {
ptr: nick_ptr,
buf_ptr: self.buf_ptr,
weechat_ptr: self.get_weechat().ptr,
buffer: PhantomData,
})
}
pub fn search_nick(&self, nick: &str) -> Option<Nick> {
let weechat = self.get_weechat();
let nick = Buffer::search_nick_helper(&weechat, self.buf_ptr, nick, None);
if nick.is_null() {
None
} else {
Some(Nick {
ptr: nick,
buf_ptr: self.buf_ptr,
weechat_ptr: weechat.ptr,
buffer: PhantomData,
})
}
}
}