dustr 0.1.2

Generate dart code based on a rust ffishim
Documentation
use ::itertools::Itertools;
use ::std::convert::TryInto;

impl crate::Library {
    pub fn build(&self, dest: &::std::path::PathBuf) -> ::anyhow::Result<()> {
        ::std::fs::write(dest.join(format!("{}.dart", self.name)), format!(
            "{imports}\n\n{structs}\n\n{enums}\n\n{functions}\n\n{wrappers}\n\n",
            imports = self.imports,
            structs = self.structs.iter().join("\n"),
            enums = self.enums.iter().join("\n"),
            functions = self.functions.iter().join("\n"),
            wrappers = self.wrappers.iter().join("\n"),
        ))?;

        if !self.subs.is_empty() {
            let subfolder = dest.join(&self.name);
            ::std::fs::create_dir(&subfolder)?;
            for sub in &self.subs {
                sub.build(&subfolder)?;
            }
        }

        Ok(())
    }
}

impl ::std::convert::TryFrom<(crate::Module, String)> for crate::Library {
    type Error = ::anyhow::Error;
    fn try_from((m, pkg): (crate::Module, String)) -> ::anyhow::Result<Self> {
        Ok(Self{
            name: m.name.clone(),
            imports: crate::Imports::from_module(&m, &pkg),
            structs: m.structs.iter().map(|d| crate::Struct::from_data(d)).collect::<Result<Vec<_>, _>>()?,
            enums: m.enums.iter().map(|d| d.try_into()).collect::<Result<Vec<_>, _>>()?,
            functions: m.functions.iter().map(|f| f.try_into()).collect::<Result<Vec<_>, _>>()?,
            wrappers: m.functions.iter().map(|f| f.try_into()).collect::<Result<Vec<_>, _>>()?,
            subs: m.subs.into_iter().map(|m| {
                Self::try_from((m, pkg.clone()))
            }).collect::<Result<Vec<_>, _>>()?,
        })
    }
}

impl crate::Library {
    pub fn new_dylib(pkg: &str) -> String {
        format!(
            "import 'dart:ffi';\n\
            \n\
            final dylib = DynamicLibrary.open('lib{lib_name}.so');\n",
            lib_name = pkg,
        )
    }
}