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;
17pub use config::config::{Config, MetaConfig};
18pub use dumper::internal_config::ConfigDumpContent;
19pub use ir::mir::ty::rust_opaque::RustOpaqueCodecMode;
20use log::debug;
21
22/// Execute the main code generator
23pub fn generate(config: Config, meta_config: MetaConfig) -> anyhow::Result<()> {
24    debug!("config={config:?} meta_config={meta_config:?}");
25
26    let internal_config = InternalConfig::parse(&config, &meta_config)?;
27    debug!("internal_config={internal_config:?}");
28
29    let dumper = Dumper::new(&internal_config.dumper);
30    dumper
31        .with_content(ContentConfig)
32        .dump("config.json", &config)?;
33
34    controller::run(&internal_config.controller, &|| {
35        generate_once(&internal_config, &dumper)
36    })?;
37
38    Ok(())
39}
40
41fn generate_once(internal_config: &InternalConfig, dumper: &Dumper) -> anyhow::Result<()> {
42    let progress_bar_pack = GeneratorProgressBarPack::new();
43
44    dumper
45        .with_content(ContentConfig)
46        .dump("internal_config.json", &internal_config)?;
47
48    preparer::prepare(&internal_config.preparer)?;
49
50    let pb = progress_bar_pack.parse.start();
51    let mir_pack = parser::parse(&internal_config.parser, dumper, &progress_bar_pack)?;
52    drop(pb);
53
54    let pb = progress_bar_pack.generate.start();
55    let generator_output = generator::generate(
56        &mir_pack,
57        &internal_config.generator,
58        dumper,
59        &progress_bar_pack,
60    )?;
61    drop(pb);
62
63    generator_output.output_texts.write_to_disk()?;
64
65    let pb = progress_bar_pack.polish.start();
66    polisher::polish(
67        &internal_config.polisher,
68        generator_output.dart_needs_freezed,
69        generator_output.dart_needs_json_serializable,
70        &generator_output.output_texts.paths(),
71        &progress_bar_pack,
72    )?;
73    drop(pb);
74
75    println!("Done!");
76
77    Ok(())
78}