diff --git a/Cargo.lock b/Cargo.lock index 510303fc1e..43a5ac03cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8640,6 +8640,7 @@ dependencies = [ "html5ever", "indoc", "markup5ever_rcdom", + "pretty_assertions", "regex", ] diff --git a/crates/rustdoc_to_markdown/Cargo.toml b/crates/rustdoc_to_markdown/Cargo.toml index 18bb21f9d9..58a60bc7bf 100644 --- a/crates/rustdoc_to_markdown/Cargo.toml +++ b/crates/rustdoc_to_markdown/Cargo.toml @@ -19,3 +19,4 @@ regex.workspace = true [dev-dependencies] indoc.workspace = true +pretty_assertions.workspace = true diff --git a/crates/rustdoc_to_markdown/src/markdown_writer.rs b/crates/rustdoc_to_markdown/src/markdown_writer.rs index cf71982ecb..b48a780c35 100644 --- a/crates/rustdoc_to_markdown/src/markdown_writer.rs +++ b/crates/rustdoc_to_markdown/src/markdown_writer.rs @@ -114,9 +114,8 @@ impl MarkdownWriter { self.visit_node(child)?; } - self.current_element_stack.pop_back(); - if let Some(current_element) = current_element { + self.current_element_stack.pop_back(); self.end_tag(¤t_element); } diff --git a/crates/rustdoc_to_markdown/src/rustdoc_to_markdown.rs b/crates/rustdoc_to_markdown/src/rustdoc_to_markdown.rs index dbbafa2c5c..ac34213e2c 100644 --- a/crates/rustdoc_to_markdown/src/rustdoc_to_markdown.rs +++ b/crates/rustdoc_to_markdown/src/rustdoc_to_markdown.rs @@ -36,3 +36,53 @@ pub fn convert_rustdoc_to_markdown(mut html: impl Read) -> Result { Ok(markdown) } + +#[cfg(test)] +mod tests { + use indoc::indoc; + use pretty_assertions::assert_eq; + + use super::*; + + #[test] + fn test_code_blocks() { + let html = indoc! {r#" +
use axum::extract::{Path, Query, Json};
+            use std::collections::HashMap;
+
+            // `Path` gives you the path parameters and deserializes them.
+            async fn path(Path(user_id): Path<u32>) {}
+
+            // `Query` gives you the query parameters and deserializes them.
+            async fn query(Query(params): Query<HashMap<String, String>>) {}
+
+            // Buffer the request body and deserialize it as JSON into a
+            // `serde_json::Value`. `Json` supports any type that implements
+            // `serde::Deserialize`.
+            async fn json(Json(payload): Json<serde_json::Value>) {}
+ "#}; + let expected = indoc! {" + ```rs + use axum::extract::{Path, Query, Json}; + use std::collections::HashMap; + + // `Path` gives you the path parameters and deserializes them. + async fn path(Path(user_id): Path) {} + + // `Query` gives you the query parameters and deserializes them. + async fn query(Query(params): Query>) {} + + // Buffer the request body and deserialize it as JSON into a + // `serde_json::Value`. `Json` supports any type that implements + // `serde::Deserialize`. + async fn json(Json(payload): Json) {} + ``` + "} + .trim(); + + assert_eq!( + convert_rustdoc_to_markdown(html.as_bytes()).unwrap(), + expected + ) + } +}