#![forbid(unsafe_code)]
use std::path::{Path, PathBuf};
pub mod blazor;
pub mod laravel;
pub mod react;
pub mod rust;
pub struct ResolveContext<'a> {
pub from_file: &'a str,
pub reference_name: &'a str,
pub project_root: &'a Path,
}
pub trait FrameworkResolver: Send + Sync {
fn name(&self) -> &'static str;
fn detect(&self, project_root: &Path) -> bool;
fn resolve_to_paths(&self, ctx: &ResolveContext<'_>) -> Vec<PathBuf>;
}
pub fn default_resolvers() -> Vec<Box<dyn FrameworkResolver>> {
vec![
Box::new(rust::RustResolver),
Box::new(react::ReactResolver),
Box::new(blazor::BlazorResolver),
Box::new(laravel::LaravelResolver),
]
}
pub fn framework_path_hints(
project_root: &Path,
from_file: &str,
reference_name: &str,
) -> Vec<PathBuf> {
let ctx = ResolveContext {
from_file,
reference_name,
project_root,
};
for resolver in default_resolvers() {
if resolver.detect(project_root) {
let paths = resolver.resolve_to_paths(&ctx);
if !paths.is_empty() {
tracing::debug!(
resolver = resolver.name(),
reference = reference_name,
candidates = paths.len(),
"framework resolver produced path hints"
);
return paths;
}
}
}
Vec::new()
}