@@ -4,8 +4,7 @@ use std::rc::Rc;
44
55use itertools:: Itertools ;
66
7- use crate :: { ast, parser, program, resolver} ;
8- use crate :: cli:: run:: run;
7+ use crate :: { ast, parser, program, repository, resolver} ;
98use crate :: error:: { RResult , RuntimeError } ;
109use crate :: interpreter:: builtins;
1110use crate :: interpreter:: compile:: compile_server:: CompileServer ;
@@ -65,7 +64,7 @@ impl Runtime {
6564 runtime. base_scope = Rc :: new ( runtime. make_scope ( ) ?) ;
6665
6766 // Load core
68- runtime. repository . add ( "core" , PathBuf :: from ( "monoteny" ) ) ;
67+ runtime. repository . add ( "core" , builtins :: modules :: create_core_loader ( ) ) ;
6968 runtime. get_or_load_module ( & module_name ( "core" ) ) ?;
7069
7170 // Final scope can be loaded.
@@ -77,6 +76,10 @@ impl Runtime {
7776 Ok ( runtime)
7877 }
7978
79+ pub fn add_common_repository ( & mut self ) {
80+ self . repository . add ( "common" , builtins:: modules:: create_common_loader ( ) ) ;
81+ }
82+
8083 fn make_scope ( & mut self ) -> RResult < scopes:: Scope < ' static > > {
8184 let mut scope = scopes:: Scope :: new ( ) ;
8285
@@ -101,8 +104,28 @@ impl Runtime {
101104 }
102105
103106 // Gotta load the module first.
104- let path = self . repository . resolve_module_path ( name) ?;
105- let module = self . load_file_as_module ( & path, name. clone ( ) ) ?;
107+ let Some ( first_part) = name. first ( ) else {
108+ return Err ( RuntimeError :: error ( "Module name is empty..." ) . to_array ( ) ) ;
109+ } ;
110+
111+ let Some ( loader) = self . repository . entries . get ( first_part) else {
112+ return Err ( RuntimeError :: error ( format ! ( "Module not in repository: {}" , first_part) . as_str ( ) ) . to_array ( ) ) ;
113+ } ;
114+
115+ let module = match loader {
116+ repository:: Loader :: Path ( base_path) => {
117+ let path = base_path. join ( PathBuf :: from ( format ! ( "{}.monoteny" , name. join( "/" ) . as_str( ) ) ) ) ;
118+ self . load_file_as_module ( & path, name. clone ( ) ) ?
119+ } ,
120+ repository:: Loader :: Intrinsic ( map) => {
121+ let text = map. get ( name)
122+ . map ( ToString :: to_string) // TODO Expensive copy from string literal :/
123+ . ok_or ( RuntimeError :: error ( format ! ( "Error loading {:?}: missing intrinsic" , name) . as_str ( ) ) . to_array ( ) ) ?;
124+ self . load_text_as_module ( & text, name. clone ( ) ) ?
125+ // TODO Should map error as 'in string xx', like in load_file_as_module
126+ }
127+ } ;
128+
106129 self . source . module_by_name . insert ( name. clone ( ) , module) ;
107130 Ok ( & self . source . module_by_name [ name] )
108131 }
0 commit comments