Skip to content

Commit 2af8a19

Browse files
committed
feat: Allow setting the primary level for a group
1 parent fd4c760 commit 2af8a19

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

examples/elide_header.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def foobar(foor, bar={}):
99
"#;
1010

1111
let message = &[Group::new()
12+
.primary_level(Level::NOTE)
1213
.element(
1314
Snippet::source(source)
1415
.fold(false)

examples/elide_header.svg

Lines changed: 2 additions & 2 deletions
Loading

src/renderer/mod.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,16 @@ impl Renderer {
275275
if og_primary_path.is_none() && primary_path.is_some() {
276276
og_primary_path = primary_path;
277277
}
278-
let level = group
279-
.elements
280-
.iter()
281-
.find_map(|s| match &s {
282-
Element::Title(title) => Some(title.level.clone()),
283-
_ => None,
284-
})
285-
.unwrap_or(Level::ERROR);
278+
let level = group.primary_level.clone().unwrap_or_else(|| {
279+
group
280+
.elements
281+
.first()
282+
.and_then(|s| match &s {
283+
Element::Title(title) => Some(title.level.clone()),
284+
_ => None,
285+
})
286+
.unwrap_or(Level::ERROR)
287+
});
286288
let mut source_map_annotated_lines = VecDeque::new();
287289
let mut max_depth = 0;
288290
for e in &group.elements {

src/snippet.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub(crate) struct Id<'a> {
2020
/// An [`Element`] container
2121
#[derive(Clone, Debug)]
2222
pub struct Group<'a> {
23+
pub(crate) primary_level: Option<Level<'a>>,
2324
pub(crate) elements: Vec<Element<'a>>,
2425
}
2526

@@ -31,7 +32,10 @@ impl Default for Group<'_> {
3132

3233
impl<'a> Group<'a> {
3334
pub fn new() -> Self {
34-
Self { elements: vec![] }
35+
Self {
36+
primary_level: None,
37+
elements: vec![],
38+
}
3539
}
3640

3741
pub fn element(mut self, section: impl Into<Element<'a>>) -> Self {
@@ -44,6 +48,14 @@ impl<'a> Group<'a> {
4448
self
4549
}
4650

51+
/// Set the primary [`Level`] for this [`Group`]. If not specified, the
52+
/// [`Level`] of the first [`Title`] in the [`Group`] will be used, if no
53+
/// [`Title`] is present, it will default to [`Level::ERROR`].
54+
pub fn primary_level(mut self, level: Level<'a>) -> Self {
55+
self.primary_level = Some(level);
56+
self
57+
}
58+
4759
pub fn is_empty(&self) -> bool {
4860
self.elements.is_empty()
4961
}

0 commit comments

Comments
 (0)