use crate::error;
use crate::model::block::{BlockContent, Label};
use crate::model::inline::{HasInlineContent, InlineContent, Text};
use crate::model::{block::HasLabel, HasInnerContent};
#[cfg(feature = "fmt_json")]
use serde::{Deserialize, Serialize};
use std::convert::TryFrom;
#[derive(Clone, Debug, PartialEq)]
#[repr(u8)]
#[cfg_attr(feature = "fmt_json", derive(Serialize, Deserialize))]
pub enum HeadingLevel {
Section = 1,
SubSection,
SubSubSection,
SubSubSubSection,
SubSubSubSubSection,
SubSubSubSubSubSection,
SubSubSubSubSubSubSection,
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "fmt_json", derive(Serialize, Deserialize))]
pub struct Heading {
#[cfg_attr(feature = "fmt_json", serde(skip_serializing_if = "Option::is_none"))]
#[cfg_attr(feature = "fmt_json", serde(default))]
label: Option<Label>,
level: HeadingLevel,
inner: Vec<InlineContent>,
}
impl Default for HeadingLevel {
fn default() -> Self {
Self::Section
}
}
impl Default for Heading {
fn default() -> Self {
Self {
label: None,
level: Default::default(),
inner: Default::default(),
}
}
}
impl TryFrom<u8> for HeadingLevel {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
1 => Ok(HeadingLevel::Section),
2 => Ok(HeadingLevel::SubSection),
3 => Ok(HeadingLevel::SubSubSection),
4 => Ok(HeadingLevel::SubSubSubSection),
5 => Ok(HeadingLevel::SubSubSubSubSection),
6 => Ok(HeadingLevel::SubSubSubSubSubSection),
7 => Ok(HeadingLevel::SubSubSubSubSubSubSection),
_ => Err(()),
}
}
}
label_impl!(Heading);
block_impls!(Heading);
has_inline_impls!(Heading);
impl Heading {
pub fn new(inner: &str, kind: HeadingLevel) -> Self {
Self {
label: None,
level: kind,
inner: vec![Text::from(inner).into()],
}
}
pub fn section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::Section)
}
pub fn sub_section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::SubSection)
}
pub fn sub_sub_section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::SubSubSection)
}
pub fn sub_sub_sub_section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::SubSubSubSection)
}
pub fn sub_sub_sub_sub_section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::SubSubSubSubSection)
}
pub fn sub_sub_sub_sub_sub_section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::SubSubSubSubSubSection)
}
pub fn sub_sub_sub_sub_sub_sub_section(inner: &str) -> Self {
Self::new(inner, HeadingLevel::SubSubSubSubSubSubSection)
}
pub fn level(&self) -> &HeadingLevel {
&self.level
}
pub fn level_as_u8(&self) -> u8 {
self.level.clone() as u8
}
pub fn set_level(&mut self, level: HeadingLevel) -> &mut Self {
self.level = level;
self
}
}