rl_lang/interpreter/stdlib/terminal/
named_color.rs1use 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}