use crate::npm::PackageContext;
use crate::DiscoveredComponent;
use anyhow::{bail, Result};
use std::path::{Path, PathBuf};
mod fast;
pub use fast::FastDiscoveryPlugin;
pub trait DiscoveryPlugin {
fn cache_namespace(&self) -> &'static str;
#[must_use]
fn requires_package_metadata(&self) -> bool {
false
}
fn discover_local(&self, root: &Path) -> Result<Vec<DiscoveredComponent>>;
fn supports_package(&self, _package: PackageContext<'_>) -> Result<bool> {
Ok(true)
}
fn package_cache_files(&self, package: PackageContext<'_>) -> Result<Vec<PathBuf>>;
fn discover_package(&self, package: PackageContext<'_>) -> Result<Vec<DiscoveredComponent>>;
}
#[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-filenames"
}
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> {
crate::catalog::has_templates(&crate::catalog::root(package)?)
}
fn package_cache_files(&self, package: PackageContext<'_>) -> Result<Vec<PathBuf>> {
crate::catalog::cache_files(&crate::catalog::root(package)?)
}
fn discover_package(&self, package: PackageContext<'_>) -> Result<Vec<DiscoveredComponent>> {
let root = crate::catalog::root(package)?;
let components = crate::catalog::discover(package.name, &root)?;
if components.is_empty() {
bail!(
"No component templates in {}. Add <component-name>.html files; \
the filename is the custom element name.",
root.display()
);
}
Ok(components)
}
}