Skip to content

Commit bb466bf

Browse files
committed
chore: introduce RenderOutput trait
3 parents 31c34ff + e281619 + a068a19 commit bb466bf

7 files changed

Lines changed: 71 additions & 101 deletions

File tree

bench/input/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ fn main() -> std::io::Result<()> {
66
let entry = entry.ok()?;
77
if let Some(name) = entry.file_name().to_str() {
88
if let Some(name) = name.strip_suffix(".dj") {
9-
if entry.file_type().map_or(false, |ty| !ty.is_dir()) {
9+
if entry.file_type().is_ok_and(|ty| !ty.is_dir()) {
1010
let input = std::fs::read_to_string(
1111
std::path::Path::new(".").join(entry.file_name()),
1212
)

src/html.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::ListKind;
99
use crate::Map;
1010
use crate::OrderedListNumbering::*;
1111
use crate::Render;
12+
use crate::RenderOutput;
1213
use crate::SpanLinkType;
1314

1415
/// Render events into a string.
@@ -373,6 +374,17 @@ where
373374
}
374375
}
375376

377+
impl<'s, W> RenderOutput<'s> for Renderer<'s, W>
378+
where
379+
W: std::fmt::Write,
380+
{
381+
type Output = W;
382+
383+
fn into_output(self) -> Self::Output {
384+
self.output
385+
}
386+
}
387+
376388
impl<'s, W> Render<'s> for Renderer<'s, WriteAdapter<W>>
377389
where
378390
W: std::io::Write,

src/lib.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ pub trait Render<'s> {
7474
fn finish(&mut self) -> Result<(), Self::Error>;
7575
}
7676

77+
/// Utility extensions method for [`Render`] trait
7778
pub trait RenderExt<'s>: Render<'s> {
7879
/// Parse and render the whole document with `renderer`
7980
fn render_document(&mut self, src: &'s str) -> Result<(), Self::Error> {
@@ -97,6 +98,28 @@ pub trait RenderExt<'s>: Render<'s> {
9798

9899
impl<'s, R> RenderExt<'s> for R where R: Render<'s> {}
99100

101+
/// A `Render` that produces an output
102+
pub trait RenderOutput<'s>: Render<'s> {
103+
type Output;
104+
fn into_output(self) -> Self::Output;
105+
}
106+
107+
/// Utility extension method for [`RenderOutput`] trait
108+
pub trait RenderOutputExt<'s>: RenderOutput<'s> {
109+
fn render_into_document(
110+
mut self,
111+
input: &'s str,
112+
) -> Result<Self::Output, <Self as Render<'s>>::Error>
113+
where
114+
Self: Sized,
115+
{
116+
RenderExt::<'s>::render_document(&mut self, input)?;
117+
Ok(self.into_output())
118+
}
119+
}
120+
121+
impl<'s, R> RenderOutputExt<'s> for R where R: RenderOutput<'s> {}
122+
100123
/// A Djot event.
101124
///
102125
/// A Djot document is represented by a sequence of events. An element may consist of one or

tests/afl/Cargo.lock

Lines changed: 19 additions & 95 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/afl/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ edition = "2021"
55
default-run = "main"
66

77
[dependencies]
8-
afl = "0.11"
8+
afl = "0.17"
99
jotdown = { path = "../../", features = ["deterministic"] }
1010
html5ever = "0.26"
1111

tests/filters.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use jotdown::{Container, Event, Render, RenderExt as _};
1+
use jotdown::{Container, Event, Render, RenderExt as _, RenderOutput};
22
use std::borrow::Cow;
33

44
struct RickrollRenderer<R>(R);
@@ -31,6 +31,17 @@ where
3131
}
3232
}
3333

34+
impl<'s, R> RenderOutput<'s> for RickrollRenderer<R>
35+
where
36+
R: RenderOutput<'s>,
37+
{
38+
type Output = R::Output;
39+
40+
fn into_output(self) -> Self::Output {
41+
self.0.into_output()
42+
}
43+
}
44+
3445
#[test]
3546
fn rickroll_me() {
3647
use jotdown::RenderOutputExt;
@@ -40,7 +51,7 @@ fn rickroll_me() {
4051
.unwrap();
4152

4253
assert_eq!(
43-
r.0.into_inner(),
54+
out,
4455
"<p><a href=\"https://www.youtube.com/watch?v=E4WlUXrJgy4\">interesting link</a></p>"
4556
);
4657
}

tests/html-ref/build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
fn main() {
22
let has_dj = std::fs::read_dir(".").unwrap().any(|e| {
3-
e.map_or(false, |e| {
3+
e.is_ok_and(|e| {
44
e.path()
55
.extension()
6-
.map_or(false, |ext| ext.to_str() == Some("dj"))
6+
.is_some_and(|ext| ext.to_str() == Some("dj"))
77
})
88
});
99
if has_dj {

0 commit comments

Comments
 (0)