use crate::core::backend::GeneratedFile;
use anyhow::Context as _;
use std::path::Path;
pub(super) fn apply_pending_migrations(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
migrate_zig_build_config(files, base_dir)?;
migrate_dart_placeholder_test_file(files, base_dir)?;
migrate_swift_placeholder_test_file(files, base_dir)?;
migrate_dart_pubignore_file(files, base_dir)?;
migrate_wasm_package_json_file(files, base_dir)?;
migrate_node_package_json_service_file(files, base_dir)?;
migrate_zig_example_file(files, base_dir)?;
migrate_kotlin_build_gradle_file(files, base_dir)?;
migrate_php_composer_files(files, base_dir)?;
migrate_java_checkstyle_file(files, base_dir)?;
migrate_wasm_cargo_config_unconditional(base_dir)?;
migrate_poly_toml_unconditional(base_dir)?;
Ok(())
}
fn migrate_zig_build_config(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(build_zig) = files
.iter()
.find(|file| file.path == Path::new("packages/zig/build.zig"))
{
crate::scaffold::migrate_build_zig_test_target(base_dir)
.context("failed to migrate pre-existing packages/zig/build.zig test target")?;
crate::scaffold::migrate_zig_build_ffi_include_default(base_dir, &build_zig.content)
.context("failed to migrate pre-existing packages/zig/build.zig ffi include default")?;
}
Ok(())
}
fn migrate_dart_placeholder_test_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(dart_test_file) = files.iter().find(|file| {
file.path.starts_with("packages/dart/test")
&& file
.path
.file_name()
.and_then(|name| name.to_str())
.is_some_and(|name| name.ends_with("_test.dart"))
}) {
crate::scaffold::migrate_dart_placeholder_test(base_dir, &dart_test_file.path, &dart_test_file.content)
.context("failed to migrate pre-existing packages/dart/test/*_test.dart placeholder")?;
}
Ok(())
}
fn migrate_swift_placeholder_test_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(swift_test_file) = files.iter().find(|file| {
file.path.starts_with("packages/swift/Tests")
&& file
.path
.file_name()
.and_then(|name| name.to_str())
.is_some_and(|name| name.ends_with("Tests.swift"))
}) {
crate::scaffold::migrate_swift_placeholder_test(base_dir, &swift_test_file.path, &swift_test_file.content)
.context("failed to migrate pre-existing packages/swift/Tests/*Tests.swift placeholder")?;
}
Ok(())
}
fn migrate_dart_pubignore_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(pubignore_file) = files
.iter()
.find(|file| file.path == Path::new("packages/dart/.pubignore"))
{
crate::scaffold::migrate_dart_pubignore(base_dir, &pubignore_file.path, &pubignore_file.content)
.context("failed to migrate pre-existing packages/dart/.pubignore")?;
}
Ok(())
}
fn migrate_wasm_package_json_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(wasm_pkg_file) = files.iter().find(|file| {
file.path
.to_str()
.is_some_and(|path| path.ends_with("-wasm/package.json"))
}) {
crate::scaffold::migrate_wasm_package_json(base_dir, &wasm_pkg_file.path)
.context("failed to migrate pre-existing crates/*-wasm/package.json")?;
}
Ok(())
}
fn migrate_node_package_json_service_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(node_pkg_file) = files.iter().find(|file| {
file.path.file_name() == Some(std::ffi::OsStr::new("package.json"))
&& file
.path
.parent()
.and_then(|parent| parent.file_name())
.and_then(|name| name.to_str())
.is_some_and(|name| name.ends_with("-node"))
}) {
crate::scaffold::migrate_node_package_json_service_export(base_dir, &node_pkg_file.path)
.context("failed to migrate pre-existing crates/*-node/package.json service export")?;
}
Ok(())
}
fn migrate_zig_example_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if let Some(zig_example_file) = files
.iter()
.find(|file| file.path == Path::new("packages/zig/examples/example.zig"))
{
crate::scaffold::migrate_zig_example(base_dir, &zig_example_file.path, &zig_example_file.content)
.context("failed to migrate pre-existing packages/zig/examples/example.zig")?;
}
Ok(())
}
fn migrate_kotlin_build_gradle_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if files
.iter()
.any(|file| file.path == Path::new("packages/kotlin/build.gradle.kts"))
{
crate::scaffold::migrate_kotlin_build_gradle(base_dir)
.context("failed to migrate pre-existing packages/kotlin/build.gradle.kts")?;
}
Ok(())
}
fn migrate_php_composer_files(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
for composer_file in files.iter().filter(|file| {
file.path
.file_name()
.and_then(|name| name.to_str())
.is_some_and(|name| name == "composer.json")
}) {
crate::scaffold::migrate_php_composer_phpunit_constraint(base_dir, &composer_file.path)
.context("failed to migrate pre-existing composer.json phpunit constraint")?;
}
Ok(())
}
fn migrate_java_checkstyle_file(files: &[GeneratedFile], base_dir: &Path) -> anyhow::Result<()> {
if files
.iter()
.any(|file| file.path == Path::new("packages/java/checkstyle.xml"))
{
crate::scaffold::migrate_java_checkstyle_line_length(base_dir, Path::new("packages/java/checkstyle.xml"))
.context("failed to migrate pre-existing packages/java/checkstyle.xml LineLength ceiling")?;
}
Ok(())
}
fn migrate_wasm_cargo_config_unconditional(base_dir: &Path) -> anyhow::Result<()> {
crate::scaffold::migrate_wasm_cargo_config_allow_multiple_definition(base_dir)
.context("failed to migrate pre-existing .cargo/config.toml wasm32 rustflags")?;
Ok(())
}
fn migrate_poly_toml_unconditional(base_dir: &Path) -> anyhow::Result<()> {
crate::scaffold::migrate_poly_toml_drop_snippet_hook(base_dir)
.context("failed to migrate pre-existing poly.toml alef-snippets pre-commit hook")?;
Ok(())
}