#![allow(clippy::vec_init_then_push)]
pub use crate::commands::ensure_tools_available;
pub use crate::config::opts::Opts;
pub use crate::config::opts_parser::config_parse;
pub use crate::config::raw_opts::RawOpts;
pub use crate::logs::init_logger;
pub use crate::utils::misc::get_symbols_if_no_duplicates;
mod logs;
#[macro_use]
mod commands;
pub mod config;
pub mod dump;
mod entrypoint;
mod error;
mod generator;
mod ir;
mod others;
mod parser;
mod target;
mod transformer;
pub mod utils;
use crate::entrypoint::dart::generate_dart_code;
use crate::entrypoint::rust::generate_rust_code;
use crate::utils::misc::BlockIndex;
use log::info;
pub fn frb_codegen(config: &Opts, all_symbols: &[String]) -> anyhow::Result<()> {
frb_codegen_multi(&[config.clone()], 0, all_symbols)
}
pub fn frb_codegen_multi(
all_configs: &[Opts],
index: usize,
all_symbols: &[String],
) -> anyhow::Result<()> {
info!("Phase: Validate config(s)");
for (i, config) in all_configs.iter().enumerate() {
assert_eq!(
BlockIndex(i),
config.block_index,
"order index({}) != block_index({})",
i,
config.block_index
);
}
let config = &all_configs[index];
info!("Picked config: {:?}", config);
info!("Phase: Parse source code to AST, then to IR");
let raw_ir_file = config.get_ir_file()?;
info!("Phase: Transform IR");
let ir_file = transformer::transform(raw_ir_file);
info!("Phase: Generate Rust code");
let generated_rust = generate_rust_code(config, &ir_file)?;
info!("Phase: Generate Dart code");
generate_dart_code(config, all_configs, &ir_file, generated_rust, all_symbols)?;
info!("Success!");
Ok(())
}