oters_lang 0.1.3

Language definitions and interpreter for the oters programming language
Documentation
#![allow(dead_code)]

use anyhow::Result;
use types::check::ProgramChecker;

pub mod errors;
pub mod export;
pub mod exprs;
pub mod interpret;
pub mod parser;
pub mod std;
pub mod types;

pub use oters_macro::run;

use crate as oters;
pub use crate::export::{ExportFns, Value};
use crate::std::*;
pub use crate::types::Type;
oters::export::export_list!();

pub fn load_std_lib(checker: &mut ProgramChecker) -> Result<oters::export::PathExportFns> {
    let std_src = include_str!("std.otrs").to_string();
    let std_lib = parser::parse_source(std_src.clone()).map_err(|e| e.to_anyhow(&std_src))?;
    checker
        .type_check_program(
            &std_lib,
            vec!["std".to_string()],
            Some((
                EXPORT_FNS.clone(),
                EXPORT_STRUCTS.clone(),
                EXPORT_ENUMS.clone(),
            )),
        )
        .map_err(|e| e.to_anyhow(&std_src))?;

    let stream_src = include_str!("std/stream.otrs").to_string();
    let stream = parser::parse_source(stream_src.clone()).map_err(|e| e.to_anyhow(&stream_src))?;
    checker
        .type_check_program(&stream, vec!["std".to_string(), "stream".to_string()], None)
        .map_err(|e| e.to_anyhow(&std_src))?;

    let event_src = include_str!("std/event.otrs").to_string();
    let event = parser::parse_source(event_src.clone()).map_err(|e| e.to_anyhow(&event_src))?;
    checker
        .type_check_program(&event, vec!["std".to_string(), "event".to_string()], None)
        .map_err(|e| e.to_anyhow(&std_src))?;

    let path_export_fns: oters::export::PathExportFns = EXPORT_FNS
        .iter()
        .map(|(name, vals)| ((vec!["std".to_string()], name.clone()), vals.clone()))
        .collect();

    Ok(path_export_fns)
}