use crate::catalog::PackageCatalog;
use crate::npm::PackageContext;
use crate::{DiscoveredComponent, PreparedPackage};
use anyhow::{bail, Result};
use std::path::Path;
mod fast;
pub use fast::FastDiscoveryPlugin;
pub trait DiscoveryPlugin {
fn cache_namespace(&self) -> &'static str;
fn discover_local(&self, root: &Path) -> Result<Vec<DiscoveredComponent>>;
fn supports_package(&self, _package: PackageContext<'_>) -> Result<bool> {
Ok(true)
}
fn prepare_package(&self, package: PackageContext<'_>) -> Result<PreparedPackage>;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct WebUIDiscoveryPlugin;
impl WebUIDiscoveryPlugin {
#[must_use]
pub const fn new() -> Self {
Self
}
}
impl DiscoveryPlugin for WebUIDiscoveryPlugin {
fn cache_namespace(&self) -> &'static str {
"webui-prepared-v1"
}
fn discover_local(&self, root: &Path) -> Result<Vec<DiscoveredComponent>> {
crate::catalog::discover(&root.to_string_lossy(), root)
}
fn supports_package(&self, package: PackageContext<'_>) -> Result<bool> {
PackageCatalog::new(package)?.has_templates(|_| true)
}
fn prepare_package(&self, package: PackageContext<'_>) -> Result<PreparedPackage> {
let catalog = PackageCatalog::new(package)?;
let components = catalog.prepare(|_| true)?;
if components.is_empty() && !catalog.is_disabled() {
bail!(
"No component templates in {}. Add <component-name>.html files under \
components/ or declare webui.components in package.json; \
the filename is the custom element name.",
package.root.display()
);
}
Ok(PreparedPackage::Files(components))
}
}