veruna_kernel/sites/
site_kit.rs1use 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}