Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
Commit aa7f6f7b authored by Pierre Jarriges's avatar Pierre Jarriges
Browse files

wip remove page; tofix find_parent_mut

parent fcc89a52
No related branches found
No related tags found
No related merge requests found
...@@ -190,6 +190,24 @@ impl WebSite { ...@@ -190,6 +190,24 @@ impl WebSite {
None 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> { pub fn get_page(&self, id: usize) -> Option<&Page> {
Self::find_page(&self.root_page, id) Self::find_page(&self.root_page, id)
} }
...@@ -198,6 +216,10 @@ impl WebSite { ...@@ -198,6 +216,10 @@ impl WebSite {
Self::find_page_mut(&mut self.root_page, id) 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> { pub fn add_page(&mut self, parent_page_id: usize, page: Page) -> Result<(), String> {
let id = self.last_generated_page_id + 1; let id = self.last_generated_page_id + 1;
let parent_page = Self::find_page_mut(&mut self.root_page, parent_page_id); let parent_page = Self::find_page_mut(&mut self.root_page, parent_page_id);
...@@ -306,6 +328,30 @@ impl WebSite { ...@@ -306,6 +328,30 @@ impl WebSite {
Self::update_page_rec_after_template_update(sp, template); 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)] #[cfg(test)]
...@@ -472,4 +518,16 @@ mod test_website { ...@@ -472,4 +518,16 @@ mod test_website {
} }
remove_test_dir(&test_dir); 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);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment