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