use crate::SharedPluginable;
use rolldown_plugin::Plugin;
use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub(crate) enum PluginPhase {
Virtual = 0,
#[allow(dead_code)]
Resolve = 10,
Transform = 20,
Assets = 30,
PostProcess = 100,
}
pub(crate) trait FobPlugin: Plugin {
fn phase(&self) -> PluginPhase {
PluginPhase::Transform
}
}
pub(crate) struct PluginRegistry {
plugins: Vec<(PluginPhase, SharedPluginable)>,
}
impl PluginRegistry {
pub fn new() -> Self {
Self {
plugins: Vec::new(),
}
}
pub fn add<P: FobPlugin + 'static>(&mut self, plugin: P) {
let phase = plugin.phase();
let plugin_arc: SharedPluginable = Arc::new(plugin);
self.plugins.push((phase, plugin_arc));
}
pub fn add_with_phase(&mut self, plugin: SharedPluginable, phase: PluginPhase) {
self.plugins.push((phase, plugin));
}
pub fn into_rolldown_plugins(mut self) -> Vec<SharedPluginable> {
self.plugins.sort_by_key(|(phase, _)| *phase);
self.plugins.into_iter().map(|(_, plugin)| plugin).collect()
}
#[allow(dead_code)]
pub fn len(&self) -> usize {
self.plugins.len()
}
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.plugins.is_empty()
}
}
impl Default for PluginRegistry {
fn default() -> Self {
Self::new()
}
}