lookas 1.10.0

Perception aligned terminal-based audio spectrum visualizer
Documentation
use anyhow::Result;
use crossterm::{
    cursor, execute, queue,
    style::{Color, ResetColor, SetForegroundColor},
    terminal::{self, ClearType},
};
use lookas::config::RgbColor;
use std::io::{BufWriter, Stdout, Write, stdout};

pub struct TerminalSession {
    out: BufWriter<Stdout>,
}

impl TerminalSession {
    pub fn enter(color: RgbColor) -> Result<Self> {
        let mut out = BufWriter::with_capacity(1024 * 1024, stdout());

        terminal::enable_raw_mode()?;
        execute!(
            out,
            terminal::EnterAlternateScreen,
            cursor::Hide,
            terminal::Clear(ClearType::All),
            terminal_color(color),
        )?;
        out.flush()?;

        Ok(Self { out })
    }

    pub fn writer(&mut self) -> &mut BufWriter<Stdout> {
        &mut self.out
    }

    pub fn set_color(&mut self, color: RgbColor) -> Result<()> {
        queue!(self.out, terminal_color(color),)?;
        self.out.flush()?;

        Ok(())
    }

    pub fn clear(&mut self) -> Result<()> {
        queue!(self.out, terminal::Clear(ClearType::All),)?;
        self.out.flush()?;

        Ok(())
    }
}

impl Drop for TerminalSession {
    fn drop(&mut self) {
        let mut out = stdout();
        let _ = execute!(
            out,
            ResetColor,
            cursor::Show,
            terminal::LeaveAlternateScreen
        );
        let _ = terminal::disable_raw_mode();
    }
}

const fn terminal_color(color: RgbColor) -> SetForegroundColor {
    SetForegroundColor(Color::Rgb {
        r: color.r,
        g: color.g,
        b: color.b,
    })
}