use std::io::{self, Write};
use rocketsplash_formats::SplashMeta;
use crate::render::write_ansi;
use crate::{ColorMode, RenderBuffer};
#[derive(Clone, Debug)]
pub struct Splash {
pub meta: SplashMeta,
pub(crate) buffer: RenderBuffer,
}
impl Splash {
pub fn print(&self) {
let _ = self.write_with_mode(ColorMode::TrueColor, &mut io::stdout());
}
pub fn print_at(&self, row: u16, col: u16) {
let mut stdout = io::stdout();
let _ = write!(stdout, "\x1b[{};{}H", row, col);
let _ = self.write_with_mode(ColorMode::TrueColor, &mut stdout);
}
pub fn print_with_mode(&self, mode: ColorMode) {
let _ = self.write_with_mode(mode, &mut io::stdout());
}
pub fn write_to<W: Write>(&self, w: &mut W) -> io::Result<()> {
self.write_with_mode(ColorMode::TrueColor, w)
}
pub fn dimensions(&self) -> (usize, usize) {
(self.buffer.width, self.buffer.height)
}
pub fn buffer(&self) -> &RenderBuffer {
&self.buffer
}
fn write_with_mode<W: Write>(&self, mode: ColorMode, w: &mut W) -> io::Result<()> {
write_ansi(&self.buffer, mode, w)
}
}
impl std::fmt::Display for Splash {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut buffer = Vec::new();
if self
.write_with_mode(ColorMode::TrueColor, &mut buffer)
.is_ok()
{
f.write_str(&String::from_utf8_lossy(&buffer))
} else {
Ok(())
}
}
}