Skip to main content

lib_flutter_rust_bridge_codegen/library/codegen/
mod.rs

1//! Code generator for `flutter_rust_bridge`
2
3pub(crate) mod config;
4mod controller;
5pub(crate) mod dumper;
6pub(crate) mod generator;
7pub(crate) mod ir;
8mod misc;
9pub(crate) mod parser;
10mod polisher;
11mod preparer;
12
13use crate::codegen::config::internal_config::InternalConfig;
14use crate::codegen::dumper::internal_config::ConfigDumpContent::Config as ContentConfig;
15use crate::codegen::dumper::Dumper;
16use crate::codegen::misc::GeneratorProgressBarPack;
17use crate::misc::FvmInstallMode;
18pub use config::config::{Config, MetaConfig};
19pub use dumper::internal_config::ConfigDumpContent;
20pub use ir::mir::ty::rust_opaque::RustOpaqueCodecMode;
21use log::debug;
22
23/// Execute the main code generator
24pub fn generate(config: Config, meta_config: MetaConfig) -> anyhow::Result<()> {
25    // This compatibility wrapper only preserves the public API shape; behavior is covered
26    // through the explicit mode-aware generator path.
27    // frb-coverage:ignore-start
28    generate_with_fvm_install_mode(config, meta_config, FvmInstallMode::Normal)
29    // frb-coverage:ignore-end
30}
31
32/// Execute the main code generator with an explicit FVM install mode.
33pub fn generate_with_fvm_install_mode(
34    config: Config,
35    meta_config: MetaConfig,
36    fvm_install_mode: FvmInstallMode,
37) -> anyhow::Result<()> {
38    debug!("config={config:?} meta_config={meta_config:?}");
39
40    let mut internal_config = InternalConfig::parse(&config, &meta_config)?;
41    internal_config.polisher.fvm_install_mode = fvm_install_mode;
42    debug!("internal_config={internal_config:?}");
43
44    let dumper = Dumper::new(&internal_config.dumper);
45    dumper
46        .with_content(ContentConfig)
47        .dump("config.json", &config)?;
48
49    controller::run(&internal_config.controller, &|| {
50        generate_once(&internal_config, &dumper)
51    })?;
52
53    Ok(())
54}
55
56fn generate_once(internal_config: &InternalConfig, dumper: &Dumper) -> anyhow::Result<()> {
57    let progress_bar_pack = GeneratorProgressBarPack::new();
58
59    dumper
60        .with_content(ContentConfig)
61        .dump("internal_config.json", &internal_config)?;
62
63    preparer::prepare(&internal_config.preparer)?;
64
65    let pb = progress_bar_pack.parse.start();
66    let mir_pack = parser::parse(&internal_config.parser, dumper, &progress_bar_pack)?;
67    drop(pb);
68
69    let pb = progress_bar_pack.generate.start();
70    let generator_output = generator::generate(
71        &mir_pack,
72        &internal_config.generator,
73        dumper,
74        &progress_bar_pack,
75    )?;
76    drop(pb);
77
78    generator_output.output_texts.write_to_disk()?;
79
80    let pb = progress_bar_pack.polish.start();
81    polisher::polish(
82        &internal_config.polisher,
83        generator_output.dart_needs_freezed,
84        generator_output.dart_needs_json_serializable,
85        &generator_output.output_texts.paths(),
86        &progress_bar_pack,
87    )?;
88    drop(pb);
89
90    println!("Done!");
91
92    Ok(())
93}