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}