use super::traits::{Container, VisualStructure};
use super::ContentItem;
pub fn try_as_container(item: &ContentItem) -> Option<&dyn Container> {
match item {
ContentItem::Session(s) => Some(s as &dyn Container),
ContentItem::Definition(d) => Some(d as &dyn Container),
ContentItem::Annotation(a) => Some(a as &dyn Container),
ContentItem::ListItem(li) => Some(li as &dyn Container),
ContentItem::VerbatimBlock(v) => Some(v.as_ref() as &dyn Container),
_ => None,
}
}
pub fn get_visual_header(item: &ContentItem) -> Option<String> {
if !item.has_visual_header() {
return None;
}
try_as_container(item).map(|c| c.label().to_string())
}
pub fn get_children(item: &ContentItem) -> &[ContentItem] {
match item {
ContentItem::Session(s) => s.children(),
ContentItem::Paragraph(p) => &p.lines,
ContentItem::List(l) => &l.items,
ContentItem::Definition(d) => d.children(),
ContentItem::ListItem(li) => li.children(),
ContentItem::Annotation(a) => a.children(),
ContentItem::VerbatimBlock(_) => &[],
_ => &[],
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::lex::ast::elements::{Paragraph, Session};
#[test]
fn test_try_as_container_session() {
let session = Session::with_title("Test".to_string());
let item = ContentItem::Session(session);
assert!(try_as_container(&item).is_some());
assert_eq!(try_as_container(&item).unwrap().label(), "Test");
}
#[test]
fn test_try_as_container_paragraph() {
let para = Paragraph::from_line("Test".to_string());
let item = ContentItem::Paragraph(para);
assert!(try_as_container(&item).is_none());
}
#[test]
fn test_get_visual_header_session() {
let session = Session::with_title("My Title".to_string());
let item = ContentItem::Session(session);
assert_eq!(get_visual_header(&item), Some("My Title".to_string()));
}
#[test]
fn test_get_visual_header_paragraph() {
let para = Paragraph::from_line("Text".to_string());
let item = ContentItem::Paragraph(para);
assert_eq!(get_visual_header(&item), None);
}
#[test]
fn test_get_children_session() {
let session = Session::with_title("Test".to_string());
let item = ContentItem::Session(session);
assert_eq!(get_children(&item).len(), 0);
}
#[test]
fn test_get_children_paragraph() {
let para = Paragraph::from_line("Test".to_string());
let item = ContentItem::Paragraph(para);
assert_eq!(get_children(&item).len(), 1);
}
}