1 use crate::comment::CommentStyle;
2 use std::fmt::{self, Display};
4 /// Formats a string as a doc comment using the given [`CommentStyle`].
6 pub(super) struct DocCommentFormatter<'a> {
8 style: CommentStyle<'a>,
11 impl Display for DocCommentFormatter<'_> {
12 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
13 let opener = self.style.opener().trim_end();
14 let mut lines = self.literal.lines().peekable();
16 // Handle `#[doc = ""]`.
17 if lines.peek().is_none() {
18 return write!(formatter, "{}", opener);
21 while let Some(line) = lines.next() {
22 let is_last_line = lines.peek().is_none();
24 write!(formatter, "{}{}", opener, line)?;
26 writeln!(formatter, "{}{}", opener, line)?;
38 fn literal_controls_leading_spaces() {
39 test_doc_comment_is_formatted_correctly(
42 CommentStyle::TripleSlash,
47 fn single_line_doc_comment_is_formatted_correctly() {
48 test_doc_comment_is_formatted_correctly(
51 CommentStyle::TripleSlash,
56 fn multi_line_doc_comment_is_formatted_correctly() {
57 test_doc_comment_is_formatted_correctly(
58 "Lorem ipsum\nDolor sit amet",
59 "///Lorem ipsum\n///Dolor sit amet",
60 CommentStyle::TripleSlash,
65 fn whitespace_within_lines_is_preserved() {
66 test_doc_comment_is_formatted_correctly(
67 " Lorem ipsum \n Dolor sit amet ",
68 "/// Lorem ipsum \n/// Dolor sit amet ",
69 CommentStyle::TripleSlash,
73 fn test_doc_comment_is_formatted_correctly(
75 expected_comment: &str,
76 style: CommentStyle<'_>,
80 format!("{}", DocCommentFormatter::new(literal, style))