sofie-model 0.3.0

The app model: modules, areas and routes, read from source without compiling it.
Documentation
use std::path::Path;

use crate::load::{files_with_extension, subdirectories};
use crate::naming::file_stem;
use crate::{MailTemplate, ModelError};

pub(crate) fn read_mails(module: &Path, crate_name: &str) -> Result<Vec<MailTemplate>, ModelError> {
    let folder = module.join("src").join("mails");
    let mut mails = keyed(&folder, crate_name)?;
    for replaced in subdirectories(&folder)? {
        mails.extend(keyed(&replaced, &file_stem(&replaced))?);
    }
    Ok(mails)
}

fn keyed(folder: &Path, owner: &str) -> Result<Vec<MailTemplate>, ModelError> {
    let files = files_with_extension(folder, "html")?;
    Ok(files
        .into_iter()
        .map(|file| MailTemplate {
            key: format!("{owner}/{}", file_stem(&file)),
            file,
        })
        .collect())
}