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