use std::fmt;
use std::result::Result as StdResult;
use luajit::{self as lua, Poppable, Pushable};
use serde::{Deserialize, Serialize};
use types::{
self as nvim,
conversion::{self, FromObject, ToObject},
Object,
TabHandle,
};
use crate::choose;
use crate::ffi::tabpage::*;
use crate::Result;
use crate::SuperIterator;
use crate::Window;
#[derive(Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct TabPage(pub(crate) TabHandle);
impl fmt::Debug for TabPage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_tuple("TabPage").field(&self.0).finish()
}
}
impl fmt::Display for TabPage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(self, f)
}
}
impl<H: Into<TabHandle>> From<H> for TabPage {
fn from(handle: H) -> Self {
Self(handle.into())
}
}
impl From<TabPage> for Object {
fn from(tabpage: TabPage) -> Self {
tabpage.0.into()
}
}
impl Poppable for TabPage {
unsafe fn pop(
lstate: *mut lua::ffi::lua_State,
) -> std::result::Result<Self, lua::Error> {
TabHandle::pop(lstate).map(Into::into)
}
}
impl Pushable for TabPage {
unsafe fn push(
self,
lstate: *mut lua::ffi::lua_State,
) -> std::result::Result<std::ffi::c_int, lua::Error> {
self.0.push(lstate)
}
}
impl FromObject for TabPage {
fn from_object(obj: Object) -> StdResult<Self, conversion::Error> {
Ok(TabHandle::from_object(obj)?.into())
}
}
impl TabPage {
#[inline(always)]
pub fn current() -> Self {
crate::get_current_tabpage()
}
pub fn del_var(&mut self, name: &str) -> Result<()> {
let mut err = nvim::Error::new();
let name = nvim::String::from(name);
unsafe { nvim_tabpage_del_var(self.0, name.non_owning(), &mut err) };
choose!(err, ())
}
pub fn get_number(&self) -> Result<u32> {
let mut err = nvim::Error::new();
let number = unsafe { nvim_tabpage_get_number(self.0, &mut err) };
choose!(err, Ok(number.try_into().expect("always positive")))
}
pub fn get_var<Var>(&self, name: &str) -> Result<Var>
where
Var: FromObject,
{
let mut err = nvim::Error::new();
let name = nvim::String::from(name);
let obj = unsafe {
nvim_tabpage_get_var(
self.0,
name.non_owning(),
#[cfg(feature = "neovim-0-10")] types::arena(),
&mut err,
)
};
choose!(err, Ok(Var::from_object(obj)?))
}
pub fn get_win(&self) -> Result<Window> {
let mut err = nvim::Error::new();
let handle = unsafe { nvim_tabpage_get_win(self.0, &mut err) };
choose!(err, Ok(handle.into()))
}
pub fn is_valid(&self) -> bool {
unsafe { nvim_tabpage_is_valid(self.0) }
}
pub fn list_wins(&self) -> Result<impl SuperIterator<Window>> {
let mut err = nvim::Error::new();
let list = unsafe {
nvim_tabpage_list_wins(
self.0,
#[cfg(feature = "neovim-0-10")] types::arena(),
&mut err,
)
};
choose!(
err,
Ok({
list.into_iter().map(|obj| Window::from_object(obj).unwrap())
})
)
}
pub fn set_var<Var>(&mut self, name: &str, value: Var) -> Result<()>
where
Var: ToObject,
{
let mut err = nvim::Error::new();
let name = nvim::String::from(name);
unsafe {
nvim_tabpage_set_var(
self.0,
name.non_owning(),
value.to_object()?.non_owning(),
&mut err,
)
};
choose!(err, ())
}
#[cfg(feature = "neovim-0-10")] #[cfg_attr(
docsrs,
doc(cfg(any(feature = "neovim-0-10", feature = "neovim-nightly")))
)]
pub fn set_win(&mut self, win: &Window) -> Result<()> {
let mut err = nvim::Error::new();
unsafe { nvim_tabpage_set_win(self.0, win.0, &mut err) };
choose!(err, ())
}
}