Skip to main content

rl_lang/interpreter/stdlib/terminal/
named_color.rs

1use crate::interpreter::stdlib::common::{extract_string, try_fn, verr, vs};
2use crate::interpreter::{evaluator::Evaluator, values::Value};
3use crossterm::{
4    execute,
5    style::{Color, SetBackgroundColor, SetForegroundColor},
6};
7use std::io::stdout;
8
9fn parse_color(s: &str) -> Option<Color> {
10    match s {
11        "black" => Some(Color::Black),
12        "red" => Some(Color::Red),
13        "green" => Some(Color::Green),
14        "yellow" => Some(Color::Yellow),
15        "blue" => Some(Color::Blue),
16        "magenta" => Some(Color::Magenta),
17        "cyan" => Some(Color::Cyan),
18        "white" => Some(Color::White),
19        "dark_black" => Some(Color::DarkGrey),
20        "dark_red" => Some(Color::DarkRed),
21        "dark_green" => Some(Color::DarkGreen),
22        "dark_yellow" => Some(Color::DarkYellow),
23        "dark_blue" => Some(Color::DarkBlue),
24        "dark_magenta" => Some(Color::DarkMagenta),
25        "dark_cyan" => Some(Color::DarkCyan),
26        "grey" => Some(Color::Grey),
27        _ => None,
28    }
29}
30
31pub fn std_term_fg(_: &mut Evaluator, arg: Value) -> Value {
32    let name = match extract_string(arg, "term_fg") {
33        Ok(v) => v,
34        Err(e) => return verr!(vs!(e)),
35    };
36
37    let color = match parse_color(&name) {
38        Some(v) => v,
39        None => return verr!(vs!(format!("term_fg(): unknown color \"{}\"", name))),
40    };
41
42    try_fn!("term_fg", execute!(stdout(), SetForegroundColor(color)));
43
44    Value::Ok(Box::new(Value::Null))
45}
46
47pub fn std_term_bg(_: &mut Evaluator, arg: Value) -> Value {
48    let name = match extract_string(arg, "term_fg") {
49        Ok(v) => v,
50        Err(e) => return verr!(vs!(e)),
51    };
52
53    let color = match parse_color(&name) {
54        Some(v) => v,
55        None => return verr!(vs!(format!("term_fg(): unknown color \"{}\"", name))),
56    };
57
58    try_fn!("term_bg", execute!(stdout(), SetBackgroundColor(color)));
59
60    Value::Ok(Box::new(Value::Null))
61}