swamp_script/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/script
 * Licensed under the MIT License. See LICENSE in the project root for license information.
 */
use std::path::Path;
use swamp_script_analyzer::ResolveError;
use swamp_script_analyzer::ResolvedProgram;
use swamp_script_dep_loader::{
    parse_dependant_modules_and_resolve, DepLoaderError, DependencyParser, ParseModule,
};
use swamp_script_eval_loader::resolve_program;
use swamp_script_source_map::SourceMap;
pub mod prelude;

#[derive(Debug)]
pub enum ScriptResolveError {
    ResolveError(ResolveError),
    DepLoaderError(DepLoaderError),
}

impl From<ResolveError> for ScriptResolveError {
    fn from(err: ResolveError) -> Self {
        Self::ResolveError(err)
    }
}

impl From<DepLoaderError> for ScriptResolveError {
    fn from(err: DepLoaderError) -> Self {
        Self::DepLoaderError(err)
    }
}

pub fn compile_and_resolve(
    root_path: &Path,
    module_path: &[String],
    parse_module: ParseModule,
    source_map: &mut SourceMap,
) -> Result<ResolvedProgram, ScriptResolveError> {
    let mut dependency_parser = DependencyParser::new();
    dependency_parser.add_ast_module(module_path.to_vec(), parse_module);

    let module_paths_in_order = parse_dependant_modules_and_resolve(
        root_path.to_owned(),
        module_path.to_vec(),
        &mut dependency_parser,
        source_map,
    )?;

    let mut resolved_program = ResolvedProgram::new();
    resolve_program(
        &resolved_program.types,
        &mut resolved_program.state,
        &mut resolved_program.modules,
        source_map,
        &module_paths_in_order,
        &dependency_parser,
    )?;

    Ok(resolved_program)
}