mod loader;
use crate::core::constants::STDLIB_DIR;
use crate::ide::AnalysisHost;
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_into_host(&mut self, host: &mut AnalysisHost) -> Result<bool, String> {
if self.loaded {
return Ok(false);
}
self.load_into_host(host)?;
self.loaded = true;
Ok(true)
}
pub fn load_into_host(&self, host: &mut AnalysisHost) -> Result<(), String> {
loader::load_into_host(&self.stdlib_path, host)
}
}
impl Default for StdLibLoader {
fn default() -> Self {
Self::new()
}
}