scraps 1.0.1

Scraps is a portable CLI knowledge hub for managing interconnected Markdown documentation with Wiki-link notation.
use chrono_tz::Tz;
use scraps_libs::model::{base_url::BaseUrl, content::Content, scrap::Scrap, tag::Tag};

use crate::error::ScrapsResult;
use crate::usecase::build::model::{
    backlinks_map::BacklinksMap,
    css::CssMetadata,
    html::HtmlMetadata,
    list_view_configs::ListViewConfigs,
    scrap_detail::{ScrapDetail, ScrapDetails},
};

pub trait HtmlIndexRenderer {
    fn render_index(
        &self,
        base_url: &BaseUrl,
        html_metadata: &HtmlMetadata,
        list_view_configs: &ListViewConfigs,
        scrap_details: &ScrapDetails,
        backlinks_map: &BacklinksMap,
        readme_content: &Option<Content>,
    ) -> ScrapsResult<usize>;
}

pub trait HtmlScrapRenderer {
    fn render_scrap(
        &self,
        base_url: &BaseUrl,
        timezone: Tz,
        html_metadata: &HtmlMetadata,
        scrap_detail: &ScrapDetail,
        backlinks_map: &BacklinksMap,
    ) -> ScrapsResult<()>;
}

pub trait HtmlTagsIndexRenderer {
    fn render_tags_index(
        &self,
        base_url: &BaseUrl,
        html_metadata: &HtmlMetadata,
        scraps: &[Scrap],
        backlinks_map: &BacklinksMap,
    ) -> ScrapsResult<()>;
}

pub trait HtmlTagRenderer {
    fn render_tag(
        &self,
        base_url: &BaseUrl,
        html_metadata: &HtmlMetadata,
        tag: &Tag,
        backlinks_map: &BacklinksMap,
    ) -> ScrapsResult<()>;
}

pub trait CssRenderer {
    fn render_css(&self, css_metadata: &CssMetadata) -> ScrapsResult<()>;
}

pub trait SearchIndexJsonRenderer {
    fn render_search_index(&self, base_url: &BaseUrl, scraps: &[Scrap]) -> ScrapsResult<()>;
}

pub trait BuildRenderer:
    HtmlIndexRenderer
    + HtmlScrapRenderer
    + HtmlTagsIndexRenderer
    + HtmlTagRenderer
    + CssRenderer
    + SearchIndexJsonRenderer
    + Sync
{
}

impl<T> BuildRenderer for T where
    T: HtmlIndexRenderer
        + HtmlScrapRenderer
        + HtmlTagsIndexRenderer
        + HtmlTagRenderer
        + CssRenderer
        + SearchIndexJsonRenderer
        + Sync
{
}

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

    pub struct BuildRendererTest();

    impl BuildRendererTest {
        pub fn new() -> Self {
            Self()
        }
    }

    impl HtmlIndexRenderer for BuildRendererTest {
        fn render_index(
            &self,
            _base_url: &BaseUrl,
            _html_metadata: &HtmlMetadata,
            _list_view_configs: &ListViewConfigs,
            _scrap_details: &ScrapDetails,
            _backlinks_map: &BacklinksMap,
            _readme_content: &Option<Content>,
        ) -> ScrapsResult<usize> {
            Ok(1)
        }
    }

    impl HtmlScrapRenderer for BuildRendererTest {
        fn render_scrap(
            &self,
            _base_url: &BaseUrl,
            _timezone: Tz,
            _html_metadata: &HtmlMetadata,
            _scrap_detail: &ScrapDetail,
            _backlinks_map: &BacklinksMap,
        ) -> ScrapsResult<()> {
            Ok(())
        }
    }

    impl HtmlTagsIndexRenderer for BuildRendererTest {
        fn render_tags_index(
            &self,
            _base_url: &BaseUrl,
            _html_metadata: &HtmlMetadata,
            _scraps: &[Scrap],
            _backlinks_map: &BacklinksMap,
        ) -> ScrapsResult<()> {
            Ok(())
        }
    }

    impl HtmlTagRenderer for BuildRendererTest {
        fn render_tag(
            &self,
            _base_url: &BaseUrl,
            _html_metadata: &HtmlMetadata,
            _tag: &Tag,
            _backlinks_map: &BacklinksMap,
        ) -> ScrapsResult<()> {
            Ok(())
        }
    }

    impl CssRenderer for BuildRendererTest {
        fn render_css(&self, _css_metadata: &CssMetadata) -> ScrapsResult<()> {
            Ok(())
        }
    }

    impl SearchIndexJsonRenderer for BuildRendererTest {
        fn render_search_index(&self, _base_url: &BaseUrl, _scraps: &[Scrap]) -> ScrapsResult<()> {
            Ok(())
        }
    }
}