Skip to main content

rl_lang/interpreter/stdlib/terminal/
size.rs

1use crate::ast::statements::TypeAnnotation;
2use crate::interpreter::stdlib::common::{try_fn, verr, vi, vnl, vok, vs};
3use crate::interpreter::stdlib::terminal::common::extract_u16;
4use crate::interpreter::{evaluator::Evaluator, values::Value};
5use crossterm::{
6    execute,
7    terminal::{SetSize, size},
8};
9use std::io::stdout;
10
11pub fn std_term_get_size(_: &mut Evaluator) -> Value {
12    let (cols, rows) = match size() {
13        Ok((cols, rows)) => (cols, rows),
14        Err(e) => return verr!(vs!(format!("term_get_size(): {}", e))),
15    };
16
17    vok!(Value::Values {
18        items_type: TypeAnnotation::Int,
19        items: vec![vi!(cols as i64), vi!(rows as i64)],
20    })
21}
22
23pub fn std_term_set_size(_: &mut Evaluator, cols: Value, rows: Value) -> Value {
24    let cols = match extract_u16(cols, "cols") {
25        Ok(v) => v,
26        Err(e) => return verr!(vs!(e)),
27    };
28    let rows = match extract_u16(rows, "rows") {
29        Ok(v) => v,
30        Err(e) => return verr!(vs!(e)),
31    };
32
33    try_fn!("term_set_size", execute!(stdout(), SetSize(cols, rows)));
34    vok!(vnl!())
35}