flutter_rust_bridge_codegen 2.0.0-dev.0

High-level memory-safe binding generator for Flutter/Dart <-> Rust
Documentation
use crate::codegen::dumper::internal_config::{ConfigDumpContent, DumperInternalConfig};
use crate::codegen::generator::acc::Acc;
use crate::codegen::generator::misc::target::TargetOrCommon;
use crate::codegen::generator::misc::PathTexts;
use crate::utils::file_utils::create_dir_all_and_write;
use crate::utils::path_utils::path_to_string;
use convert_case::{Case, Casing};
use log::debug;
use serde::Serialize;
use std::path::Path;
use strum::IntoEnumIterator;

pub(super) mod internal_config;

pub(crate) struct Dumper<'a>(pub &'a DumperInternalConfig);

impl Dumper<'_> {
    pub(crate) fn dump<T: Serialize>(
        &self,
        content: ConfigDumpContent,
        name: &str,
        data: &T,
    ) -> anyhow::Result<()> {
        if !self.is_enabled(content) {
            return Ok(());
        }

        self.dump_str(content, name, &serde_json::to_string_pretty(data)?)
    }

    pub(crate) fn dump_path_texts(
        &self,
        content: ConfigDumpContent,
        partial_name: &str,
        path_texts: &PathTexts,
        base_dir: &Path,
    ) -> anyhow::Result<()> {
        if !self.is_enabled(content) {
            return Ok(());
        }

        for path_text in path_texts.0.iter() {
            self.dump_str(
                content,
                &format!(
                    "{partial_name}/{}",
                    path_to_string(path_text.path.strip_prefix(base_dir)?)?
                ),
                &path_text.text,
            )?;
        }

        Ok(())
    }

    pub(crate) fn dump_acc(
        &self,
        content: ConfigDumpContent,
        partial_name: &str,
        extension: &str,
        acc: &Acc<Option<String>>,
    ) -> anyhow::Result<()> {
        if !self.is_enabled(content) {
            return Ok(());
        }

        for target in TargetOrCommon::iter() {
            self.dump_str(
                content,
                &format!("{partial_name}/{target}.{extension}"),
                &acc[target].clone().unwrap_or_default(),
            )?;
        }

        Ok(())
    }

    pub(crate) fn dump_str(
        &self,
        content: ConfigDumpContent,
        name: &str,
        str: &str,
    ) -> anyhow::Result<()> {
        if !self.is_enabled(content) {
            return Ok(());
        }

        let path = self
            .0
            .dump_directory
            .join(content.to_string().to_case(Case::Snake))
            .join(name);
        debug!("Dumping {name} into {path:?}");

        create_dir_all_and_write(path, str)
    }

    fn is_enabled(&self, content: ConfigDumpContent) -> bool {
        self.0.dump_contents.contains(&content)
    }
}