in starlark/src/values/docs.rs [248:315]
fn parse_and_remove_sections(
self,
kind: DocStringKind,
requested_sections: &[&str],
) -> (Self, HashMap<String, String>) {
let mut sections = HashMap::new();
let mut finish_section =
|current_section: &mut Option<String>, current_section_text: &mut Vec<String>| {
if let Some(s) = current_section.take() {
sections.insert(s, DocString::join_and_dedent_lines(current_section_text));
current_section_text.clear();
}
};
static STARLARK_SECTION_RE: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^([\w -]+):\s*$").unwrap());
static STARLARK_INDENTED_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"^(?:\s|$)").unwrap());
static RUST_SECTION_RE: Lazy<Regex> =
Lazy::new(|| Regex::new(r"^# ([\w -]+)\s*$").unwrap());
static RUST_INDENTED_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"^.*").unwrap());
let (section_re, indented_re) = match kind {
DocStringKind::Starlark => (&STARLARK_SECTION_RE, &STARLARK_INDENTED_RE),
DocStringKind::Rust => (&RUST_SECTION_RE, &RUST_INDENTED_RE),
};
if let Some(details) = self.details {
let mut new_details = vec![];
let mut current_section = None;
let mut current_section_text = vec![];
for line in details.lines() {
if let Some(matches) = section_re.captures(line) {
finish_section(&mut current_section, &mut current_section_text);
let found_section = matches.get(1).unwrap().as_str().to_ascii_lowercase();
if requested_sections.contains(&found_section.as_str()) {
current_section = Some(found_section);
} else {
new_details.push(line.to_owned());
}
} else if current_section.is_some() && indented_re.is_match(line) {
current_section_text.push(line.to_owned());
} else {
new_details.push(line.to_owned());
finish_section(&mut current_section, &mut current_section_text);
}
}
finish_section(&mut current_section, &mut current_section_text);
let joined_details = new_details.join("\n").trim().to_owned();
let details = match joined_details.is_empty() {
true => None,
false => Some(joined_details),
};
(
Self {
summary: self.summary,
details,
},
sections,
)
} else {
(self, sections)
}
}