Separate generated definitions from implementations

The generated bridge_generated.dart by default contains definitions of the APIs as well as the implementations. With the flag --dart-decl-output, the two can be separated, and the definitions will not contain anything like dart:ffi.

A command example as follow:

flutter_rust_bridge_codegen .. --dart-decl-output <DECL>

where DECL is the path to the common class/function declarations file. For example, if you emit your Dart bridge to lib/bridge_generated.dart, you can put the declarations file at lib/bridge_definitions.dart

By default this will create new file:

├── lib
│   ├── bridge_definitions.dart

More information: #298.

Injecting WASM initialization code

By default, this library injects its own initialization code to facilitate panic information recovery using console_error_panic_hook. If you would like to run some initialization code for WASM, e.g. to set up logging libraries, specify default-features = false in Cargo.toml:

flutter_rust_bridge = { version = "..", default-features = false, features = [..] }

The wasm-start feature governs this behavior and is enabled by default.

Logging for developers

For developers who want to contribute to this project, here is the feature logging that needs to mention.

When the code in frb_codegen is modified, usually developers want to build and run it locally for testing. Now with the init_logger in logs.rs from frb_codegen, it is easy to do so. Take frb_example/pure_dart as an example, in ./rust/build.rs, with:

use lib_flutter_rust_bridge_codegen::init_logger;
fn main() {

Then, all information from standard panic, log::info!(), log::debug()!... of frb_codegen would be recorded to ./logs/ with a file name of date, like 2023-02-01.log in frb_example/pure_dart/rust as long as the example is built through build.rs. Note, the data from the same day would be appended to the same file.

Moreover, if rust-analyzer is used, then whenever frb_codegen is modified, all examples with build.rs would be automatically triggered to rebuild. Then the log would be updated automatically to disk, which makes the whole developing routine easier.