1use std::path::Path;
6use swamp_script_analyzer::prelude::ResolveError;
7use swamp_script_analyzer::prelude::ResolvedProgram;
8use swamp_script_dep_loader::{
9 parse_dependant_modules_and_resolve, DepLoaderError, DependencyParser, ParseModule,
10};
11use swamp_script_eval_loader::resolve_program;
12use swamp_script_source_map::SourceMap;
13pub mod prelude;
14
15#[derive(Debug)]
16pub enum ScriptResolveError {
17 ResolveError(ResolveError),
18 DepLoaderError(DepLoaderError),
19}
20
21impl From<ResolveError> for ScriptResolveError {
22 fn from(err: ResolveError) -> Self {
23 Self::ResolveError(err)
24 }
25}
26
27impl From<DepLoaderError> for ScriptResolveError {
28 fn from(err: DepLoaderError) -> Self {
29 Self::DepLoaderError(err)
30 }
31}
32
33pub fn compile_and_resolve(
34 root_path: &Path,
35 module_path: &[String],
36 parse_module: ParseModule,
37 source_map: &mut SourceMap,
38) -> Result<ResolvedProgram, ScriptResolveError> {
39 let mut dependency_parser = DependencyParser::new();
40 dependency_parser.add_ast_module(module_path.to_vec(), parse_module);
41
42 let module_paths_in_order = parse_dependant_modules_and_resolve(
43 root_path.to_owned(),
44 module_path.to_vec(),
45 &mut dependency_parser,
46 source_map,
47 )?;
48
49 let mut resolved_program = ResolvedProgram::new();
50 resolve_program(
51 &mut resolved_program.state,
52 &mut resolved_program.modules,
53 source_map,
54 &module_paths_in_order,
55 &dependency_parser,
56 )?;
57
58 Ok(resolved_program)
59}