Newer
Older
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct WebSite {
root_page: Page,
assets_index: Vec<String>,
templates: Vec<PageTemplate>,
pages_index: HashMap<PathBuf, Page>,
pub fn from_json(json: &str) -> Self {
let mut obj: Self = serde_json::from_str(json).unwrap();
obj.build_assets_index();
obj.build_pages_index(obj.root_page.clone(), PathBuf::from("/"));
obj.root_page.build_html();
for p in obj.root_page.sub_pages.iter_mut() {
p.build_html();
pub fn load(config: &AppConfig) -> WebSite {
let file_path = match &config.load {
None => std::env::current_dir()
.unwrap()
.join("templates")
.join("new_website.json"),
Some(pth) => pth.clone(),
};
WebSite::from_json(&std::fs::read_to_string(file_path).unwrap())
fn build_pages_index(&mut self, root_page: Page, from_url: PathBuf) {
let url = from_url.join(&root_page.metadata.url_slug);
self.pages_index.insert(url.clone(), root_page.clone());
for p in root_page.sub_pages {
self.build_pages_index(p, url.clone());
fn build_assets_index(&mut self) {
unimplemented!();
}
pub fn get_page_by_url(&self, url: &PathBuf) -> Option<&Page> {
self.pages_index.get(&PathBuf::from("/").join(url))
// #[cfg(test)]
// mod test_website {
// use super::*;
// use crate::testing::TEST_JSON_WEBSITE;
// #[test]
// fn test_index_pages_by_slug() {
// let website = WebSite::from_json(TEST_JSON_WEBSITE);
// let root_page = website.get_page_by_url(&PathBuf::from("/"));
// assert!(root_page.is_some());
// let root_page = root_page.unwrap();
// assert_eq!(root_page.page_data.html_body, "<h1>Test Website</h1>");
// let sub_page = website.get_page_by_url(&PathBuf::from("subpage"));
// assert!(sub_page.is_some());
// let sub_page = sub_page.unwrap();
// assert_eq!(sub_page.page_data.html_body, "<h1>A sub page</h1>");
// let nested_page = website.get_page_by_url(&PathBuf::from("subpage/nested"));
// assert!(nested_page.is_some());
// let nested_page = nested_page.unwrap();
// assert_eq!(nested_page.page_data.html_body, "<h1>Nested page</h1>");
// }
// }