mod parts;
mod scan;
use super::ownership::{write_owned, Outcome, Ownership};
use std::path::Path;
use std::{fs, io};
pub use parts::{File, Layout, Module};
pub fn write<P, D>(
out: &Path,
modules: &[Module],
root: &'static str,
parent: P,
declares: D,
force: bool,
) -> io::Result<Layout>
where
P: Fn(&[Module]) -> String,
D: Fn(&str, &str) -> bool,
{
fs::create_dir_all(out)?;
let mut outcomes = Vec::new();
for module in modules {
outcomes.extend(write_module(out, module, force)?);
}
let written = write_owned(out, root, &parent(modules), Ownership::Scaffold, force)?;
let undeclared = if written.is_preserved() {
scan::missing(&out.join(root), modules, declares)
} else {
Vec::new()
};
outcomes.push(written);
Ok(Layout {
outcomes,
undeclared,
})
}
fn write_module(out: &Path, module: &Module, force: bool) -> io::Result<Vec<Outcome>> {
let directory = out.join(&module.name);
fs::create_dir_all(&directory)?;
module
.files
.iter()
.map(|file| write_owned(&directory, file.name, &file.contents, file.ownership, force))
.collect()
}