//! Paragraph. use crate::xml::element::{Element, Elements, FromElements}; mod part; pub use part::{Error as PartError, Part}; /// A paragraph. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Paragraph { parts: Vec, } impl Paragraph { /// Returns a new `Paragraph`. pub fn new(parts: impl IntoIterator) -> Self { Self { parts: parts.into_iter().collect(), } } /// Returns the parts of the paragraph. #[must_use] pub fn parts(&self) -> &[Part] { &self.parts } } impl FromElements for Paragraph { type Error = Error; fn from_elements(elements: &Elements) -> Result { let parts = elements .into_iter() .filter_map(|element| { if matches!(element, Element::Comment(_)) { return None; } Some(Part::from_elements(&Elements::from([element.clone()]))) }) .collect::, _>>()?; Ok(Self { parts }) } } /// [`Paragraph`] error. #[derive(Debug, thiserror::Error)] pub enum Error { /// Invalid reference description part. #[error("Invalid part")] InvalidPart(#[from] PartError), }