macro_rules! bool_setters {
($($field:ident),+ $(,)?) => {
$(
#[inline]
#[must_use]
#[doc = concat!("Enables ", stringify!($field), " formatting.")]
pub fn $field(mut self) -> Self {
self.$field = true;
self
}
)+
};
}
#[expect(
clippy::struct_excessive_bools,
reason = "TextStyle intentionally stores one boolean per formatting attribute for a simple builder API"
)]
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct TextStyle {
pub bold: bool,
pub code: bool,
pub italic: bool,
pub mark: Option<crate::Color>,
pub strikethrough: bool,
pub subscript: bool,
pub superscript: bool,
pub underline: bool,
}
impl TextStyle {
bool_setters!(bold, code, italic);
#[inline]
#[must_use]
pub fn mark(mut self, color: crate::Color) -> Self {
self.mark = Some(color);
self
}
bool_setters!(strikethrough, subscript, superscript, underline);
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum Event {
EndBlockQuote,
EndCaption,
EndDefinitionDetail,
EndDefinitionList,
EndDefinitionTerm,
EndDocument,
EndFootnote,
EndHeading,
EndLink,
EndOrderedListItem,
EndParagraph,
EndPreformatted,
EndTable,
EndTableCell,
EndTableHeader,
EndTableRow,
EndUnorderedListItem,
FootnoteRef {
id: u32,
},
Image {
alt: Option<String>,
decorative: bool,
id: Option<String>,
source: crate::ImageSource,
title: Option<String>,
},
LineBreak,
SoftBreak,
StartBlockQuote {
id: Option<String>,
},
StartCaption {
id: Option<String>,
},
StartDefinitionDetail {
id: Option<String>,
},
StartDefinitionList {
id: Option<String>,
},
StartDefinitionTerm {
id: Option<String>,
},
StartDocument {
id: Option<String>,
language: Option<String>,
metadata: Option<crate::DocumentMeta>,
},
StartFootnote {
id: u32,
},
StartHeading {
id: Option<String>,
level: u8,
},
StartLink {
href: String,
id: Option<String>,
title: Option<String>,
},
StartOrderedListItem {
id: Option<String>,
level: u32,
start: Option<u64>,
style_type: crate::ListStyleType,
},
StartParagraph {
alignment: Option<crate::TextAlignment>,
id: Option<String>,
},
StartPreformatted {
id: Option<String>,
syntax: Option<String>,
},
StartTable {
id: Option<String>,
},
StartTableCell {
colspan: Option<u32>,
id: Option<String>,
rowspan: Option<u32>,
},
StartTableHeader {
abbr: Option<String>,
colspan: Option<u32>,
id: Option<String>,
rowspan: Option<u32>,
scope: Option<crate::TableHeaderScope>,
},
StartTableRow {
id: Option<String>,
},
StartUnorderedListItem {
id: Option<String>,
level: u32,
style_type: crate::ListStyleType,
},
Text {
content: String,
style: TextStyle,
},
ThematicBreak {
id: Option<String>,
},
}