oters_lang/
lib.rs

1#![allow(dead_code)]
2
3use anyhow::Result;
4use types::check::ProgramChecker;
5
6pub mod errors;
7pub mod export;
8pub mod exprs;
9pub mod interpret;
10pub mod parser;
11pub mod std;
12pub mod types;
13
14pub use oters_macro::run;
15
16pub use crate::export::{ExportFns, Value};
17pub use crate::types::Type;
18
19use crate as oters;
20use crate::std::*;
21oters::export::export_list!();
22
23pub fn load_std_lib(checker: &mut ProgramChecker) -> Result<oters::export::PathExportFns> {
24    let std_src = include_str!("std.otrs").to_string();
25    let std_lib = parser::parse_source(std_src.clone()).map_err(|e| e.to_anyhow(&std_src))?;
26    checker
27        .type_check_program(
28            &std_lib,
29            vec!["std".to_string()],
30            Some((
31                EXPORT_FNS.clone(),
32                EXPORT_STRUCTS.clone(),
33                EXPORT_ENUMS.clone(),
34            )),
35        )
36        .map_err(|e| e.to_anyhow(&std_src))?;
37
38    let stream_src = include_str!("std/stream.otrs").to_string();
39    let stream = parser::parse_source(stream_src.clone()).map_err(|e| e.to_anyhow(&stream_src))?;
40    checker
41        .type_check_program(&stream, vec!["std".to_string(), "stream".to_string()], None)
42        .map_err(|e| e.to_anyhow(&stream_src))?;
43
44    let event_src = include_str!("std/event.otrs").to_string();
45    let event = parser::parse_source(event_src.clone()).map_err(|e| e.to_anyhow(&event_src))?;
46    checker
47        .type_check_program(&event, vec!["std".to_string(), "event".to_string()], None)
48        .map_err(|e| e.to_anyhow(&event_src))?;
49
50    let path_export_fns: oters::export::PathExportFns = EXPORT_FNS
51        .iter()
52        .map(|(name, vals)| ((vec!["std".to_string()], name.clone()), vals.clone()))
53        .collect();
54
55    Ok(path_export_fns)
56}