veruna_kernel/sites/
site_kit.rs

1use async_trait::async_trait;
2use url::Url;
3use crate::sites::{Reader, Site, SiteBuilder, SiteBuilderImpl, SiteId, SiteIdBuilder, SiteIdBuilderImpl, SiteReader, SiteReadOption, SiteRepository};
4
5#[async_trait(?Send)]
6pub trait SiteKit {
7    async fn create(&mut self, site: Box<dyn Site>) -> Box<dyn SiteId>;
8    fn get_site(&self, url: Url) -> (&Box<dyn Site>, Box<dyn SiteId>);
9    fn reader(&self) -> Box<dyn Reader + '_>;
10    fn site_id_builder(&self) -> Box<dyn SiteIdBuilder>;
11    fn site_builder(&self) -> Box<dyn SiteBuilder>;
12}
13
14struct SiteKitImpl {
15    site_repository: Box<dyn SiteRepository>,
16}
17
18#[async_trait(?Send)]
19impl SiteKit for SiteKitImpl {
20    async fn create(&mut self, site: Box<dyn Site>) -> Box<dyn SiteId> {
21        let result = self.site_repository.create(site).await;
22        result
23    }
24
25    fn get_site(&self, url: Url) -> (&Box<dyn Site>, Box<dyn SiteId>) {
26        let domain = url.domain().unwrap().to_string();
27        let created_site = self.site_repository.read(SiteReadOption::Domain(domain));
28        created_site
29    }
30
31    fn reader(&self) -> Box<dyn Reader + '_> {
32        let repo = &self.site_repository;
33        SiteReader::new(repo)
34    }
35
36    fn site_id_builder(&self) -> Box<dyn SiteIdBuilder> {
37        let result = SiteIdBuilderImpl::new();
38        result
39    }
40
41    fn site_builder(&self) -> Box<dyn SiteBuilder> {
42        let result = SiteBuilderImpl::new();
43        result
44    }
45}
46
47pub struct SiteKitFactory;
48
49impl SiteKitFactory {
50    pub fn build(repo: Box<dyn SiteRepository>) -> Box<dyn SiteKit> {
51        let result: Box<dyn SiteKit> = Box::new(SiteKitImpl { site_repository: repo });
52        result
53    }
54}