Join adjacent lines in descriptions from #[doc]s

This commit is contained in:
Graham Esau 2019-12-07 23:05:55 +00:00
parent feefd418d4
commit a1c3daaed8
2 changed files with 33 additions and 22 deletions

View file

@ -19,13 +19,14 @@ pub struct MyStruct {
} }
/// # A Unit /// # A Unit
///
#[derive(Debug, JsonSchema)] #[derive(Debug, JsonSchema)]
pub struct MyUnitStruct; pub struct MyUnitStruct;
#[doc = " # This is the enum's title "] #[doc = " # This is the enum's title "]
#[doc = " This is..."] #[doc = " This is "]
#[derive(Debug, JsonSchema)] #[derive(Debug, JsonSchema)]
#[doc = "...the enum's description. "] #[doc = " the enum's description."]
pub enum MyEnum { pub enum MyEnum {
UndocumentedUnit, UndocumentedUnit,
/// This comment is not included in the generated schema :( /// This comment is not included in the generated schema :(
@ -37,7 +38,15 @@ pub enum MyEnum {
/// ///
/// This field is a nullable string. /// This field is a nullable string.
/// ///
/// This is another line! /// This
///is
/// the second
/// line!
///
///
///
///
/// And this is the third!
my_nullable_string: Option<String>, my_nullable_string: Option<String>,
}, },
} }

View file

@ -14,23 +14,25 @@ pub fn get_title_and_desc_from_docs(attrs: &[Attribute]) -> (Option<String>, Opt
.trim_start_matches('#') .trim_start_matches('#')
.trim() .trim()
.to_owned(); .to_owned();
let maybe_desc = split.next().map(|s| s.trim().to_owned()); let maybe_desc = split.next().and_then(get_description);
(none_if_empty(title), maybe_desc) (none_if_empty(title), maybe_desc)
} else { } else {
(None, none_if_empty(docs)) (None, get_description(&docs))
} }
} }
fn none_if_empty(s: String) -> Option<String> { fn get_description(docs: &str) -> Option<String> {
if s.is_empty() { let desc = docs
None .trim()
} else { .split("\n\n")
Some(s) .filter_map(|line| none_if_empty(line.trim().replace('\n', " ")))
} .collect::<Vec<_>>()
.join("\n\n");
none_if_empty(desc)
} }
fn get_docs(attrs: &[Attribute]) -> Option<String> { fn get_docs(attrs: &[Attribute]) -> Option<String> {
let doc_attrs = attrs let docs = attrs
.iter() .iter()
.filter_map(|attr| { .filter_map(|attr| {
if !attr.path.is_ident("doc") { if !attr.path.is_ident("doc") {
@ -44,20 +46,20 @@ fn get_docs(attrs: &[Attribute]) -> Option<String> {
None None
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>()
if doc_attrs.is_empty() {
return None;
}
let mut docs = doc_attrs
.iter() .iter()
.flat_map(|a| a.split('\n')) .flat_map(|a| a.split('\n'))
.map(str::trim) .map(str::trim)
.skip_while(|s| *s == "") .skip_while(|s| *s == "")
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join("\n"); .join("\n");
none_if_empty(docs)
docs.truncate(docs.trim_end().len()); }
Some(docs)
fn none_if_empty(s: String) -> Option<String> {
if s.is_empty() {
None
} else {
Some(s)
}
} }