pub mod codegen;
pub mod config;
pub mod escape;
pub mod field_access;
pub mod fixture;
pub mod format;
pub mod scaffold;
pub mod template_env;
pub mod validate;
use alef_core::backend::GeneratedFile;
use alef_core::config::e2e::DependencyMode;
use alef_core::config::{Language, ResolvedCrateConfig};
use anyhow::{Context, Result};
use config::E2eConfig;
use fixture::{group_fixtures, load_fixtures};
use std::path::Path;
use tracing::{info, warn};
use validate::Severity;
pub fn default_e2e_languages(scaffolded: &[Language]) -> Vec<String> {
let mut names: Vec<String> = scaffolded
.iter()
.map(|l| match l {
Language::Ffi => "c".to_string(),
other => other.to_string(),
})
.collect();
if !names.iter().any(|n| n == "rust") {
names.push("rust".to_string());
}
names
}
pub fn generate_e2e(
config: &ResolvedCrateConfig,
e2e_config: &E2eConfig,
languages: Option<&[String]>,
) -> Result<Vec<GeneratedFile>> {
let fixtures_dir = Path::new(&e2e_config.fixtures);
let fixtures = load_fixtures(fixtures_dir)
.with_context(|| format!("failed to load fixtures from {}", fixtures_dir.display()))?;
info!("Loaded {} fixture(s) from {}", fixtures.len(), e2e_config.fixtures);
let resolved_languages: Vec<String> = if let Some(langs) = languages {
langs.to_vec()
} else if !e2e_config.languages.is_empty() {
e2e_config.languages.clone()
} else {
default_e2e_languages(&config.languages)
};
let diagnostics = validate::validate_fixtures_semantic(&fixtures, e2e_config, &resolved_languages);
for diag in &diagnostics {
match diag.severity {
Severity::Error => warn!("{}: {}", diag.file, diag.message),
Severity::Warning => warn!("{}: {}", diag.file, diag.message),
}
}
let all_groups = group_fixtures(&fixtures);
let groups: Vec<_> =
if e2e_config.dep_mode == DependencyMode::Registry && !e2e_config.registry.categories.is_empty() {
let allowed = &e2e_config.registry.categories;
all_groups
.into_iter()
.filter(|g| allowed.iter().any(|c| c == &g.category))
.collect()
} else {
all_groups
};
let generators = codegen::generators_for(&resolved_languages);
let mut all_files = Vec::new();
for generator in &generators {
let files = generator.generate(&groups, e2e_config, config)?;
info!(" [{}] generated {} file(s)", generator.language_name(), files.len());
all_files.extend(files);
}
Ok(all_files)
}