flutter_rust_bridge_codegen 2.12.0

Flutter/Dart <-> Rust binding generator, feature-rich, but seamless and simple
Documentation
pub(crate) mod c;
pub(crate) mod dart;
pub(crate) mod misc;
pub(crate) mod rust;

use crate::codegen::config::internal_config::GeneratorWireInternalConfig;
use crate::codegen::dumper::Dumper;
use crate::codegen::generator::api_dart::internal_config::GeneratorApiDartInternalConfig;
use crate::codegen::generator::misc::path_texts::PathTexts;
use crate::codegen::generator::misc::target::Target;
use crate::codegen::generator::wire::dart::spec_generator::base::WireDartGeneratorContext;
use crate::codegen::generator::wire::rust::spec_generator::base::WireRustGeneratorContext;
use crate::codegen::ir::mir::pack::MirPack;
use crate::codegen::misc::GeneratorProgressBarPack;
use anyhow::Result;
use itertools::Itertools;
use std::path::PathBuf;

pub(crate) struct GeneratorWireOutput {
    pub output_texts: PathTexts,
}

pub(crate) fn generate(
    mir_pack: &MirPack,
    config: &GeneratorWireInternalConfig,
    api_dart_config: &GeneratorApiDartInternalConfig,
    api_dart_actual_output_paths: &[PathBuf],
    dumper: &Dumper,
    progress_bar_pack: &GeneratorProgressBarPack,
) -> Result<GeneratorWireOutput> {
    let wire_rust_generator_context = WireRustGeneratorContext {
        mir_pack,
        config: &config.rust,
        wire_dart_config: &config.dart,
        api_dart_config,
    };
    let wire_dart_generator_context = WireDartGeneratorContext {
        mir_pack,
        config: &config.dart,
        wire_rust_config: &config.rust,
        api_dart_config,
    };

    let rust_output = rust::generate(wire_rust_generator_context, dumper)?;

    let c_output = c::generate(
        &config.c,
        (rust_output.extern_funcs.iter())
            .filter(|x| x.target == Target::Io)
            .map(|x| x.func_name(&config.c.c_symbol_prefix))
            .collect_vec(),
        rust_output.extern_struct_names,
        &rust_output.output_texts,
        dumper,
        progress_bar_pack,
    )?;

    let dart_output = dart::generate(
        wire_dart_generator_context,
        &c_output.c_file_content,
        api_dart_actual_output_paths,
        &rust_output.extern_funcs,
        rust_output.content_hash,
        dumper,
        progress_bar_pack,
    )?;

    Ok(GeneratorWireOutput {
        output_texts: rust_output.output_texts + c_output.output_texts + dart_output.output_texts,
    })
}