use crate::core::config::{Language, ResolvedCrateConfig};
use crate::core::ir::ApiSurface;
use std::path::PathBuf;
fn managed_manifests(config: &ResolvedCrateConfig) -> Vec<(Language, PathBuf)> {
vec![
(Language::Ruby, super::ruby_native_manifest_path(config)),
(
Language::Elixir,
PathBuf::from(super::elixir_native_crate_dir(config)).join("Cargo.toml"),
),
]
}
pub(crate) fn repair_missing_cfg_binding_features(
api: &ApiSurface,
config: &ResolvedCrateConfig,
languages: &[Language],
) -> Vec<PathBuf> {
let mut repaired = Vec::new();
for (language, relative_manifest) in managed_manifests(config) {
if !languages.contains(&language) {
continue;
}
let manifest_path = crate::codegen::cfg::resolve_against_workspace_root(config, &relative_manifest);
let Ok(existing) = std::fs::read_to_string(&manifest_path) else {
continue;
};
let core_declared_features = crate::codegen::cfg::core_crate_declared_features(config);
match crate::codegen::cfg::merge_missing_cfg_features(&existing, api, &config.name, &core_declared_features) {
Ok(Some(patched)) => match std::fs::write(&manifest_path, &patched) {
Ok(()) => {
tracing::info!(
language = %language,
manifest = %manifest_path.display(),
"added missing cfg-forwarded feature(s) to this binding crate's [features] table"
);
repaired.push(manifest_path);
}
Err(error) => tracing::warn!(
language = %language,
manifest = %manifest_path.display(),
%error,
"failed to write repaired [features] table"
),
},
Ok(None) => {}
Err(error) => tracing::warn!(
language = %language,
manifest = %manifest_path.display(),
%error,
"failed to repair [features] table"
),
}
}
repaired
}