use std::path::Path;
use xpile_meta_hir::Module;
#[derive(Debug, thiserror::Error)]
pub enum FrontendError {
#[error("parse error: {0}")]
Parse(String),
#[error("lowering error: {0}")]
Lower(String),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
}
pub trait Frontend: Send + Sync {
fn name(&self) -> &'static str;
fn extensions(&self) -> &[&'static str];
fn matches_path(&self, path: &Path) -> bool {
path.extension()
.and_then(|ext| ext.to_str())
.map(|ext_str| self.extensions().contains(&ext_str))
.unwrap_or(false)
}
fn parse_and_lower(&self, path: &Path, source: &str) -> Result<Module, FrontendError>;
}