#![feature(iterator_try_collect)] use anyhow::{Context, Result}; use std::{ fs::{self, File}, path::PathBuf, }; use zip::ZipArchive; use crate::meta::PluginMeta; pub mod loader; pub mod meta; #[derive(Debug)] pub struct LocatedPlugin { pub meta: PluginMeta, pub zip: ZipArchive, pub so: bool, pub dll: bool, pub dylib: bool, } pub fn locate_plugins(dir: PathBuf) -> Result> { let mut plugins = Vec::new(); for entry in fs::read_dir(dir).context("failed reading directory")? { let entry = entry.context("failed opening directory entry")?; if entry.path().is_dir() { continue; } if entry.path().extension().is_none_or(|ext| ext != "rstn") { continue; } let mut zip = ZipArchive::new(File::open(entry.path()).context("failed opening file")?) .context("failed reading zip")?; let meta = meta::read(&mut zip)?; let so = zip.by_name("plugin.so").is_ok(); let dll = zip.by_name("plugin.dll").is_ok(); let dylib = zip.by_name("plugin.dylib").is_ok(); plugins.push(LocatedPlugin { meta, zip, so, dll, dylib, }); } Ok(plugins) }