cmark_writer/traits/
formatting.rs1use crate::error::WriteResult;
7use crate::writer::{CommonMarkWriter, HtmlWriter};
8
9pub trait CommonMarkRenderable: super::core::NodeContent {
13 fn render_commonmark(&self, writer: &mut CommonMarkWriter) -> WriteResult<()>;
15}
16
17pub trait HtmlRenderable: super::core::NodeContent {
19 fn render_html(&self, writer: &mut HtmlWriter) -> WriteResult<()>;
21}
22
23pub trait Format<W> {
27 fn format(&self, writer: &mut W) -> WriteResult<()>;
29}
30
31pub trait ToCommonMark {
33 fn to_commonmark(&self, writer: &mut CommonMarkWriter) -> WriteResult<()>;
35}
36
37pub trait ToHtml {
39 fn to_html(&self, writer: &mut HtmlWriter) -> WriteResult<()>;
41}
42
43impl<T> ToCommonMark for T
47where
48 T: Format<CommonMarkWriter>,
49{
50 fn to_commonmark(&self, writer: &mut CommonMarkWriter) -> WriteResult<()> {
51 self.format(writer)
52 }
53}
54
55impl<T> ToHtml for T
57where
58 T: Format<HtmlWriter>,
59{
60 fn to_html(&self, writer: &mut HtmlWriter) -> WriteResult<()> {
61 self.format(writer)
62 }
63}
64
65impl<T> CommonMarkRenderable for T
67where
68 T: ToCommonMark + super::core::NodeContent,
69{
70 fn render_commonmark(&self, writer: &mut CommonMarkWriter) -> WriteResult<()> {
71 self.to_commonmark(writer)
72 }
73}
74
75impl<T> HtmlRenderable for T
76where
77 T: ToHtml + super::core::NodeContent,
78{
79 fn render_html(&self, writer: &mut HtmlWriter) -> WriteResult<()> {
80 self.to_html(writer)
81 }
82}
83
84pub trait MultiFormat: ToCommonMark {
91 fn supports_html(&self) -> bool {
95 false
96 }
97
98 fn html_format(&self, writer: &mut HtmlWriter) -> WriteResult<()> {
103 writer
104 .raw_html(&format!(
105 "<!-- HTML rendering not implemented for {} -->",
106 std::any::type_name::<Self>()
107 ))
108 .map_err(Into::into)
109 }
110
111 fn render_multi<W>(&self, writer: &mut W) -> WriteResult<()>
113 where
114 W: std::any::Any + 'static,
115 {
116 if let Some(cm_writer) =
117 (writer as &mut dyn std::any::Any).downcast_mut::<CommonMarkWriter>()
118 {
119 self.to_commonmark(cm_writer)
120 } else if let Some(html_writer) =
121 (writer as &mut dyn std::any::Any).downcast_mut::<HtmlWriter>()
122 {
123 if self.supports_html() {
124 self.html_format(html_writer)
125 } else {
126 Err(crate::error::WriteError::custom(
127 "HTML format not supported for this node type",
128 ))
129 }
130 } else {
131 Err(crate::error::WriteError::custom("Unsupported writer type"))
132 }
133 }
134}
135
136impl<T> MultiFormat for T
138where
139 T: ToCommonMark + ToHtml,
140{
141 fn supports_html(&self) -> bool {
142 true
143 }
144
145 fn html_format(&self, writer: &mut HtmlWriter) -> WriteResult<()> {
146 self.to_html(writer)
147 }
148}