use crate::{TermRenderer, TermSize};
use core::fmt;
const fn term_size(cols: u16, rows: u16) -> TermSize {
TermSize { cols, rows, x: cols, y: rows }
}
#[crate::macro_apply(crate::_std_not_linux_syscall)]
pub(super) fn present_bytes(bytes: &[u8]) -> crate::IoResult<()> {
use crate::IoWrite;
let mut out = crate::Io::stdout();
out.write_all(bytes)?;
out.flush()
}
#[crate::macro_apply(crate::_linux_syscall)]
pub(super) fn present_bytes(bytes: &[u8]) -> crate::IoResult<()> {
crate::Linux::print_bytes(bytes).map_err(crate::LinuxError::to_io)
}
impl<B> TermRenderer<B> {
pub const fn from_buf(buf: B, cols: u16, rows: u16) -> Self {
Self {
buf,
len: 0,
size: term_size(cols, rows),
bytes_written: 0,
frames_presented: 0,
}
}
pub fn into_buf(self) -> B {
self.buf
}
#[must_use]
pub const fn buf(&self) -> &B {
&self.buf
}
#[must_use]
pub const fn buf_mut(&mut self) -> &mut B {
&mut self.buf
}
pub fn replace_buf<C>(self, buf: C) -> TermRenderer<C> {
TermRenderer {
buf,
len: 0,
size: self.size,
bytes_written: self.bytes_written,
frames_presented: self.frames_presented,
}
}
pub const fn size(&self) -> TermSize {
self.size
}
pub const fn set_size(&mut self, cols: u16, rows: u16) {
self.size = term_size(cols, rows);
}
#[must_use]
pub const fn cols(&self) -> u16 {
self.size.cols
}
#[must_use]
pub const fn rows(&self) -> u16 {
self.size.rows
}
#[must_use]
pub const fn bytes_written(&self) -> u64 {
self.bytes_written
}
#[must_use]
pub const fn frames_presented(&self) -> u64 {
self.frames_presented
}
}
#[crate::macro_apply(crate::_std_or_linux_syscall)]
impl<B: AsRef<[u8]>> TermRenderer<B> {
pub fn present(&mut self) -> crate::IoResult<()> {
if self.len != 0 {
let len = self.len;
present_bytes(self.buffered())?;
self.bytes_written = self.bytes_written.saturating_add(len as u64);
self.len = 0;
self.frames_presented = self.frames_presented.saturating_add(1);
}
Ok(())
}
}
impl<B: AsRef<[u8]> + AsMut<[u8]>> fmt::Write for TermRenderer<B> {
fn write_str(&mut self, s: &str) -> fmt::Result {
self.try_push_str(s).map_err(|_| fmt::Error)?;
Ok(())
}
}
impl<B: AsRef<[u8]>> fmt::Debug for TermRenderer<B> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("TermRenderer")
.field("size", &self.size)
.field("buffered_len", &self.len)
.field("capacity", &self.capacity())
.field("bytes_written", &self.bytes_written)
.field("frames_presented", &self.frames_presented)
.finish_non_exhaustive()
}
}