oxide-rs 0.1.1

AI Inference library and CLI in Rust - llama.cpp style
Documentation
use std::io::{self, Write};
use std::thread;
use std::time::Duration;

use crossterm::{
    cursor::MoveTo,
    execute,
    style::{Attribute, Color, Print, ResetColor, SetAttribute, SetForegroundColor},
    terminal::{Clear, ClearType},
};

use super::theme::Theme;

const FERRIS_BANNER: &str = r#"
  /$$$$$$            /$$       /$$          
 /$$__  $$          |__/      | $$          
| $$  \ $$ /$$   /$$ /$$  /$$$$$$$  /$$$$$$ 
| $$  | $$|  $$ /$$/| $$ /$$__  $$ /$$__  $$
| $$  | $$ \  $$$$/ | $$| $$  | $$| $$$$$$$$
| $$  | $$  >$$  $$ | $$| $$  | $$| $$_____/
|  $$$$$$/ /$$/\  $$| $$|  $$$$$$$|  $$$$$$$
 \______/ |__/  \__/|__/ \_______/ \_______/


                 🦀 OXIDE
              Fast AI Inference
"#;

pub fn print_banner() {
    let mut stdout = io::stdout();

    execute!(stdout, Clear(ClearType::All), MoveTo(0, 0)).ok();

    let lines: Vec<&str> = FERRIS_BANNER.lines().collect();

    let orange_shades: [Color; 14] = [
        Color::Rgb {
            r: 255,
            g: 107,
            b: 53,
        },
        Color::Rgb {
            r: 255,
            g: 120,
            b: 60,
        },
        Color::Rgb {
            r: 255,
            g: 133,
            b: 70,
        },
        Color::Rgb {
            r: 255,
            g: 146,
            b: 80,
        },
        Color::Rgb {
            r: 255,
            g: 159,
            b: 90,
        },
        Color::Rgb {
            r: 222,
            g: 165,
            b: 132,
        },
        Color::Rgb {
            r: 206,
            g: 145,
            b: 120,
        },
        Color::Rgb {
            r: 206,
            g: 130,
            b: 100,
        },
        Color::Rgb {
            r: 206,
            g: 115,
            b: 80,
        },
        Color::Rgb {
            r: 206,
            g: 100,
            b: 60,
        },
        Color::Rgb {
            r: 206,
            g: 85,
            b: 50,
        },
        Color::Rgb {
            r: 206,
            g: 70,
            b: 43,
        },
        Color::Rgb {
            r: 180,
            g: 60,
            b: 38,
        },
        Color::Rgb {
            r: 150,
            g: 50,
            b: 32,
        },
    ];

    for (i, line) in lines.iter().enumerate() {
        let color = if i < orange_shades.len() {
            orange_shades[i]
        } else {
            Theme::RUST_ORANGE
        };

        execute!(
            stdout,
            SetForegroundColor(color),
            Print(format!("{}\n", line)),
            ResetColor
        )
        .ok();

        thread::sleep(Duration::from_millis(25));
        stdout.flush().ok();
    }

    thread::sleep(Duration::from_millis(50));

    execute!(
        stdout,
        SetForegroundColor(Theme::IRON_GRAY),
        Print("           "),
        ResetColor,
        SetForegroundColor(Theme::RUST_ORANGE),
        SetAttribute(Attribute::Bold),
        Print("v0.1.0"),
        ResetColor,
        SetForegroundColor(Theme::IRON_GRAY),
        Print(" • Ctrl+C to exit"),
        ResetColor,
        Print("\n\n")
    )
    .ok();

    stdout.flush().ok();
}

pub fn print_divider() {
    let mut stdout = io::stdout();
    execute!(
        stdout,
        SetForegroundColor(Theme::IRON_GRAY),
        Print("  "),
        Print("".repeat(56)),
        Print("\n"),
        ResetColor
    )
    .ok();
}