Skip to main content

rl_lang/interpreter/stdlib/rl/
check.rs

1use crate::lexer::tokenizer::Tokenizer;
2use crate::parser::parser_logic::Parser;
3use crate::utils::source::SourceFile;
4use crate::{
5    checker::TypeChecker,
6    interpreter::{
7        evaluator::Evaluator,
8        stdlib::common::{extract_string, verr, vok, vs},
9        values::Value,
10    },
11};
12
13pub fn func(_: &mut Evaluator, value: Value) -> Value {
14    let code = match extract_string(value, "check") {
15        Ok(s) => s,
16        Err(e) => return verr!(vs!(e)),
17    };
18
19    let source = SourceFile::new("<check>", code);
20
21    let tokens = match Tokenizer::lex(source.clone()) {
22        Ok(t) => t,
23        Err(e) => return verr!(vs!(e.message().to_string())),
24    };
25
26    let (ast, statements) = match Parser::parse(tokens, source.clone()) {
27        Ok(s) => s,
28        Err(e) => return verr!(vs!(e.message().to_string())),
29    };
30
31    let mut checker = TypeChecker::new()
32        .with_source_file(source)
33        .with_ast_arena(ast);
34
35    let errors = checker.check(&statements);
36
37    if errors.is_empty() {
38        return vok!(Value::Null);
39    }
40    verr!(Value::Values {
41        items_type: crate::ast::statements::TypeAnnotation::String,
42        items: errors
43            .iter()
44            .map(|e| vs!(e.message().to_string()))
45            .collect(),
46    })
47}