mod loader;
use crate::core::constants::STDLIB_DIR;
use crate::semantic::Workspace;
use crate::syntax::SyntaxFile;
use std::path::PathBuf;
pub struct StdLibLoader {
stdlib_path: PathBuf,
loaded: bool,
}
impl StdLibLoader {
pub fn new() -> Self {
Self {
stdlib_path: Self::discover_path(),
loaded: false,
}
}
pub fn with_path(path: PathBuf) -> Self {
Self {
stdlib_path: path,
loaded: false,
}
}
fn discover_path() -> PathBuf {
if let Some(exe_dir) = std::env::current_exe()
.ok()
.and_then(|exe| exe.parent().map(|p| p.to_path_buf()))
{
let stdlib_next_to_exe = exe_dir.join(STDLIB_DIR);
if stdlib_next_to_exe.exists() && stdlib_next_to_exe.is_dir() {
return stdlib_next_to_exe;
}
}
PathBuf::from(STDLIB_DIR)
}
pub fn is_loaded(&self) -> bool {
self.loaded
}
pub fn ensure_loaded(&mut self, workspace: &mut Workspace<SyntaxFile>) -> Result<bool, String> {
if self.loaded || workspace.has_stdlib() {
return Ok(false);
}
self.load(workspace)?;
self.loaded = true;
Ok(true)
}
pub fn load(&self, workspace: &mut Workspace<SyntaxFile>) -> Result<(), String> {
loader::load(&self.stdlib_path, workspace)
}
}
impl Default for StdLibLoader {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests;