cartulary 0.3.0-alpha.1

The knowledge layer of your project — decisions, issues, docs, all in one place.
Documentation
//! [`AssetsReader`] over the embedded default theme. Streams every
//! file under the binary-baked `assets/` tree as an [`Asset`].

use crate::domain::model::site::{Asset, Source};
use crate::domain::usecases::site::readers::AssetsReader;
use crate::infra::driven::site::default_theme::enumerate_assets;

pub struct EmbeddedDefaultThemeAssets;

impl AssetsReader for EmbeddedDefaultThemeAssets {
    fn assets<'a>(&'a self) -> Box<dyn Iterator<Item = anyhow::Result<Asset>> + 'a> {
        Box::new(enumerate_assets().into_iter().map(|(path, bytes)| {
            let rel = path.to_string_lossy().replace('\\', "/");
            let source = Source::relative_path(&rel)?;
            Ok(Asset::new(source, bytes.to_vec()))
        }))
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn emits_at_least_the_default_stylesheet() {
        let reader = EmbeddedDefaultThemeAssets;
        let assets: Vec<Asset> = reader.assets().collect::<anyhow::Result<_>>().unwrap();
        assert!(
            assets
                .iter()
                .any(|a| a.source.as_str() == "assets/style.css"),
            "got sources: {:?}",
            assets.iter().map(|a| a.source.as_str()).collect::<Vec<_>>()
        );
    }
}