altar 0.1.0

A TUI library in the style of SwiftUI
Documentation
use std::io::Write;

use bitflags::bitflags;
use crossterm::queue;

bitflags! {
    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
    pub struct Modifier: u16 {
        const RESET = 0b0000_0001;
        const BOLD = 0b0000_0010;
        const DIM = 0b0000_0100;
        const ITALIC = 0b0000_1000;
        const UNDERLINE = 0b0001_0000;
        const BLINK = 0b0010_0000;
        const INVERSE = 0b0100_0000;
        const HIDDEN = 0b1000_0000;
        const STRIKETHROUGH = 0b0001_0000_0000;
    }
}

impl Modifier {
    pub fn write_diff<W: Write>(next: Modifier, previous: Modifier, writer: &mut W) {
        use crossterm::style::*;

        let removed = previous.difference(next);
        let added = next.difference(previous);

        if removed.contains(Modifier::BOLD) || removed.contains(Modifier::DIM) {
            queue!(writer, SetAttribute(Attribute::NormalIntensity)).unwrap();
            if next.contains(Modifier::DIM) {
                queue!(writer, SetAttribute(Attribute::Dim)).unwrap();
            } else if next.contains(Modifier::BOLD) {
                queue!(writer, SetAttribute(Attribute::Bold)).unwrap();
            }
        }

        if removed.contains(Modifier::ITALIC) {
            queue!(writer, SetAttribute(Attribute::NoItalic)).unwrap();
        }

        if removed.contains(Modifier::UNDERLINE) {
            queue!(writer, SetAttribute(Attribute::NoUnderline)).unwrap();
        }

        if removed.contains(Modifier::BLINK) {
            queue!(writer, SetAttribute(Attribute::NoBlink)).unwrap();
        }

        if removed.contains(Modifier::INVERSE) {
            queue!(writer, SetAttribute(Attribute::NoReverse)).unwrap();
        }

        if removed.contains(Modifier::HIDDEN) {
            queue!(writer, SetAttribute(Attribute::NoHidden)).unwrap();
        }

        if removed.contains(Modifier::STRIKETHROUGH) {
            queue!(writer, SetAttribute(Attribute::NotCrossedOut)).unwrap();
        }

        if added.contains(Modifier::BOLD) {
            queue!(writer, SetAttribute(Attribute::Bold)).unwrap();
        }

        if added.contains(Modifier::DIM) {
            queue!(writer, SetAttribute(Attribute::Dim)).unwrap();
        }

        if added.contains(Modifier::ITALIC) {
            queue!(writer, SetAttribute(Attribute::Italic)).unwrap();
        }

        if added.contains(Modifier::UNDERLINE) {
            queue!(writer, SetAttribute(Attribute::Underlined)).unwrap();
        }

        if added.contains(Modifier::BLINK) {
            queue!(writer, SetAttribute(Attribute::SlowBlink)).unwrap();
        }

        if added.contains(Modifier::INVERSE) {
            queue!(writer, SetAttribute(Attribute::Reverse)).unwrap();
        }

        if added.contains(Modifier::HIDDEN) {
            queue!(writer, SetAttribute(Attribute::Hidden)).unwrap();
        }

        if added.contains(Modifier::STRIKETHROUGH) {
            queue!(writer, SetAttribute(Attribute::CrossedOut)).unwrap();
        }
    }
}

pub use crossterm::style::Color;