use std::path::Path;
fn main() {
// Re-run whenever any Rust source changes.
println!("cargo:rerun-if-changed=src");
// Optional FRB codegen: regenerate flutter_rust_bridge artifacts when the
// tool is on PATH. Missing tool is not fatal — committed generated sources
// are checked in, and CI environments without FRB still build cleanly.
match std::process::Command::new("flutter_rust_bridge_codegen")
.args(["generate", "--config-file", "flutter_rust_bridge.yaml"])
.status()
{
Ok(status) if status.success() => {
// FRB v2.12+ emits `use` lists in an order rustfmt 2024 edition rewrites
// (e.g. `{transform_result_dco, Lifetimeable, Lockable}` →
// `{Lifetimeable, Lockable, transform_result_dco}`). Run rustfmt against
// the generated file so committed output is fmt-clean and `cargo fmt --check`
// stays green in CI.
match std::process::Command::new("rustfmt")
.args(["--edition", "2024", "src/frb_generated.rs"])
.status()
{
Ok(s) if s.success() => {}
Ok(s) => println!("cargo:warning=rustfmt on src/frb_generated.rs exited {s}"),
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
println!(
"cargo:warning=rustfmt not on PATH — skipping post-FRB format. Install rustfmt via rustup to keep generated bridge sources fmt-clean."
);
}
Err(err) => println!("cargo:warning=failed to spawn rustfmt: {err}"),
}
// Patch the generated Dart entrypoint so the published package resolves
// its native library from its own installed location.
patch_published_loader();
// Rewrite FRB-generated handler.executeSync/handler.executeNormal calls
// into direct handler invocations. FRB 2.x emits these calls assuming
// `handler` is a BaseHandler field, but in service-API methods `handler`
// is a user-supplied function parameter (FutureOr<R> Function(T)) which
// does not expose those methods, so the generated Dart fails to compile.
// The rewrite is idempotent (marker-gated) and runs after every FRB
// invocation — including the rebuild that fires during `dart pub get`
// in e2e flows, which is when this otherwise reverts.
fix_handler_executor_calls();
}
Ok(status) => panic!("flutter_rust_bridge_codegen generate failed (exit code: {status})"),
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
println!(
"cargo:warning=flutter_rust_bridge_codegen not on PATH — skipping codegen. Install via `cargo install flutter_rust_bridge_codegen --locked` to regenerate FRB artifacts at build time."
);
}
Err(err) => panic!("failed to spawn flutter_rust_bridge_codegen: {err}"),
}
}
{{ loader_patch }}