use rbx::RbxItem; use vfs::VfsItem; use core::Route; pub enum TransformFileResult { Value(Option), Pass, } pub enum RbxChangeResult { Write(Option), Pass, } pub enum FileChangeResult { MarkChanged(Option>), Pass, } pub trait Plugin { fn transform_file(&self, plugins: &PluginChain, vfs_item: &VfsItem) -> TransformFileResult; fn handle_rbx_change(&self, route: &Route, rbx_item: &RbxItem) -> RbxChangeResult; fn handle_file_change(&self, route: &Route) -> FileChangeResult; } pub struct PluginChain { plugins: Vec>, } impl PluginChain { pub fn new(plugins: Vec>) -> PluginChain { PluginChain { plugins, } } pub fn transform_file(&self, vfs_item: &VfsItem) -> Option { for plugin in &self.plugins { match plugin.transform_file(self, vfs_item) { TransformFileResult::Value(rbx_item) => return rbx_item, TransformFileResult::Pass => {}, } } None } pub fn handle_rbx_change(&self, route: &Route, rbx_item: &RbxItem) -> Option { for plugin in &self.plugins { match plugin.handle_rbx_change(route, rbx_item) { RbxChangeResult::Write(vfs_item) => return vfs_item, RbxChangeResult::Pass => {}, } } None } pub fn handle_file_change(&self, route: &Route) -> Option> { for plugin in &self.plugins { match plugin.handle_file_change(route) { FileChangeResult::MarkChanged(changes) => return changes, FileChangeResult::Pass => {}, } } None } }