This commit is contained in:
Hamcha 2025-01-25 13:23:02 +01:00
parent b3a5f342bd
commit 32a02d4964
Signed by: hamcha
GPG key ID: 1669C533B8CF6D89
9 changed files with 77 additions and 11 deletions
Cargo.lockCargo.toml
src
domain/entities
inbound/renderer
main.rs
outbound
repository
services

12
Cargo.lock generated
View file

@ -1510,6 +1510,7 @@ dependencies = [
"dioxus-cli-config", "dioxus-cli-config",
"dioxus-logger", "dioxus-logger",
"dotenvy", "dotenvy",
"tokio",
] ]
[[package]] [[package]]
@ -2156,6 +2157,15 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.9" version = "0.4.9"
@ -2327,7 +2337,9 @@ dependencies = [
"bytes", "bytes",
"libc", "libc",
"mio", "mio",
"parking_lot",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry",
"socket2", "socket2",
"tokio-macros", "tokio-macros",
"windows-sys 0.52.0", "windows-sys 0.52.0",

View file

@ -9,11 +9,13 @@ dioxus = { version = "0.6", features = ["fullstack"] }
dioxus-cli-config = "0.6" dioxus-cli-config = "0.6"
dioxus-logger = "0.6" dioxus-logger = "0.6"
dotenvy = { version = "0.15", optional = true } dotenvy = { version = "0.15", optional = true }
tokio = { version = "1", features = ["full"], optional = true }
[features] [features]
default = [] default = []
server = ["dioxus/server", "dotenvy"] server = ["dioxus/server", "tokio", "dotenvy"]
web = ["dioxus/web"] web = ["dioxus/web"]
tokio = ["dep:tokio"]
[profile] [profile]

View file

@ -2,3 +2,13 @@ pub struct SiteMetadata {
pub domain: String, pub domain: String,
pub title: String, pub title: String,
} }
pub struct PageInfo {
pub title: String,
pub name: String,
}
pub struct SiteInfo {
pub info: SiteMetadata,
pub pages: Vec<PageInfo>,
}

View file

@ -2,9 +2,10 @@
use dioxus::prelude::*; use dioxus::prelude::*;
#[component] mod server;
pub fn App() -> Element { pub fn App() -> Element {
rsx! { rsx! {
h1 { "hello world" } h1 { "Hello, world!" }
} }
} }

View file

@ -0,0 +1 @@

View file

@ -1,6 +1,5 @@
use dioxus::prelude::*; use dioxus::prelude::server_only;
use dioxus_logger::tracing::Level; use dioxus_logger::tracing::Level;
use outbound::repository::adapters::static_data::StaticData;
mod domain; mod domain;
mod inbound; mod inbound;
@ -16,10 +15,13 @@ fn main() {
let mut builder = dioxus::LaunchBuilder::new(); let mut builder = dioxus::LaunchBuilder::new();
server_only! { server_only! {
use outbound::repository::adapters::static_data::StaticData;
use outbound::services::site::SiteService;
builder = builder builder = builder
.with_context_provider( .with_context_provider(
|| { || {
Box::new(outbound::services::site::SiteService::new(StaticData{})) Box::new(SiteService::new(StaticData{}))
} }
); );
} }

View file

@ -1,12 +1,28 @@
use crate::{domain::entities::site::SiteMetadata, outbound::repository::site::SiteRepository}; use crate::{
domain::entities::site::{PageInfo, SiteMetadata},
outbound::repository::site::SiteRepository,
};
pub struct StaticData {} pub struct StaticData {}
impl SiteRepository for StaticData { impl SiteRepository for StaticData {
async fn get_site_by_domain(domain: &str) -> SiteMetadata { async fn get_site_by_domain(&self, domain: &str) -> SiteMetadata {
SiteMetadata { SiteMetadata {
domain: domain.to_string(), domain: domain.to_string(),
title: "Test site".to_string(), title: "Test site".to_string(),
} }
} }
async fn get_pages_for_site(&self, _: &str) -> Vec<PageInfo> {
vec![
PageInfo {
title: "Home".to_string(),
name: "/".to_string(),
},
PageInfo {
title: "Cool page".to_string(),
name: "cool".to_string(),
},
]
}
} }

View file

@ -1,5 +1,6 @@
use crate::domain::entities::site::SiteMetadata; use crate::domain::entities::site::{PageInfo, SiteMetadata};
pub trait SiteRepository { pub trait SiteRepository {
async fn get_site_by_domain(domain: &str) -> SiteMetadata; async fn get_site_by_domain(&self, domain: &str) -> SiteMetadata;
async fn get_pages_for_site(&self, domain: &str) -> Vec<PageInfo>;
} }

View file

@ -1,4 +1,4 @@
use crate::outbound::repository::site::SiteRepository; use crate::{domain::entities::site::SiteInfo, outbound::repository::site::SiteRepository};
pub struct SiteService<SiteRepo: SiteRepository> { pub struct SiteService<SiteRepo: SiteRepository> {
site_repository: SiteRepo, site_repository: SiteRepo,
@ -8,4 +8,25 @@ impl<SiteRepo: SiteRepository> SiteService<SiteRepo> {
pub fn new(site_repository: SiteRepo) -> Self { pub fn new(site_repository: SiteRepo) -> Self {
Self { site_repository } Self { site_repository }
} }
pub async fn get_site(&self, domain: &str) -> SiteInfo {
let info = self.site_repository.get_site_by_domain(domain).await;
let pages = self.site_repository.get_pages_for_site(&info.domain).await;
SiteInfo { info, pages }
}
}
#[cfg(test)]
mod tests {
use super::SiteService;
use crate::outbound::repository::adapters::static_data::StaticData;
#[tokio::test]
async fn gets_site_info() {
let service = SiteService::new(StaticData {});
let info = service.get_site("example.com").await;
assert_eq!(info.info.domain, "example.com");
assert_eq!(info.info.title, "Test site");
assert_eq!(info.pages.len(), 2);
}
} }