rl_lang/interpreter/stdlib/rl/
check.rs1use 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}