use crate::core::backend::GeneratedFile;
use crate::core::config::ResolvedCrateConfig;
use heck::ToSnakeCase;
pub(super) fn patch_native_stub_module(files: &mut [GeneratedFile], config: &ResolvedCrateConfig) {
let Some(native) = files
.iter_mut()
.find(|f| f.path.file_name().and_then(|n| n.to_str()) == Some("native.ex"))
else {
return;
};
if !native.content.contains("def set_env(") {
const ANCHOR: &str = "or Mix.env() in [:dev]\n";
if let Some(pos) = native.content.find(ANCHOR) {
let insert_at = pos + ANCHOR.len();
native.content.insert_str(
insert_at,
"\n @doc false\n def set_env(_key, _value), do: :erlang.nif_error(:nif_not_loaded)\n",
);
}
}
for bridge in &config.trait_bridges {
if bridge.exclude_languages.iter().any(|l| l == "elixir" || l == "rustler") {
continue;
}
let Some(register_fn) = bridge.register_fn.as_deref() else {
continue;
};
let needle = format!("def {}(", register_fn.to_snake_case());
let Some(start) = native.content.find(&needle) else {
continue;
};
let args_start = start + needle.len();
let Some(rel_end) = native.content[args_start..].find(')') else {
continue;
};
let args_end = args_start + rel_end;
if &native.content[args_start..args_end] != "_pid, _name" {
native.content.replace_range(args_start..args_end, "_pid, _name");
}
}
}