From aa7f6f7b0e13e522110aaecf1a00121cc92edbdd Mon Sep 17 00:00:00 2001 From: peterrabbit <pierre.jarriges@tutanota.com> Date: Sat, 1 Oct 2022 19:02:10 +0200 Subject: [PATCH] wip remove page; tofix find_parent_mut --- src/website/website.rs | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/website/website.rs b/src/website/website.rs index 946c180..c250819 100644 --- a/src/website/website.rs +++ b/src/website/website.rs @@ -190,6 +190,24 @@ impl WebSite { None } + fn find_page_parent_mut<'a>( + page: &'a mut Page, + parent_page: Option<&'a mut Page>, + match_id: usize, + ) -> Result<&'a mut Page, String> { + if page.get_id() == match_id { + return Ok(parent_page.expect("Page must have a parent")); + } + + for sp in page.sub_pages.iter_mut() { + if let Ok(parent) = Self::find_page_parent_mut(sp, Some(page), match_id) { + return Ok(parent); + }; + } + + Err(format!("Page with id {} was not found", match_id)) + } + pub fn get_page(&self, id: usize) -> Option<&Page> { Self::find_page(&self.root_page, id) } @@ -198,6 +216,10 @@ impl WebSite { Self::find_page_mut(&mut self.root_page, id) } + fn get_page_parent_mut(&mut self, id: usize) -> Result<&mut Page, String> { + Self::find_page_parent_mut(&mut self.root_page, None, id) + } + pub fn add_page(&mut self, parent_page_id: usize, page: Page) -> Result<(), String> { let id = self.last_generated_page_id + 1; let parent_page = Self::find_page_mut(&mut self.root_page, parent_page_id); @@ -306,6 +328,30 @@ impl WebSite { Self::update_page_rec_after_template_update(sp, template); } } + + fn validate_page_to_remove(&mut self, id: usize) -> Result<&mut Page, String> { + let res = self.get_page_parent_mut(id); + if let Err(msg) = res { + return Err(msg); + } + + Ok(res.unwrap()) + } + + pub fn remove_page(&mut self, id: usize) -> Result<(), String> { + match self.validate_page_to_remove(id) { + Ok(parent) => { + parent.sub_pages = parent + .sub_pages + .iter() + .filter(|sp| sp.get_id() != id) + .map(|p| p.clone()) + .collect::<Vec<Page>>(); + Ok(()) + } + Err(msg) => Err(msg), + } + } } #[cfg(test)] @@ -472,4 +518,16 @@ mod test_website { } remove_test_dir(&test_dir); } + + #[test] + fn test_remove_page() { + let test_dir = PathBuf::from("./test"); + let mut ws = test_website(&test_dir); + let remove_root_page = ws.remove_page(1); + assert!(remove_root_page.is_err()); + let remove_subpage = ws.remove_page(2); + assert!(remove_subpage.is_ok()); + assert!(ws.get_page(2).is_none()); + remove_test_dir(&test_dir); + } } -- GitLab