Skip to content

Commit 5f0b425

Browse files
committed
feat: Allow setting the primary level for a group
1 parent 74cc62b commit 5f0b425

File tree

4 files changed

+29
-11
lines changed

4 files changed

+29
-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(door, 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-
.first()
281-
.and_then(|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: 16 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,15 @@ impl<'a> Group<'a> {
4448
self
4549
}
4650

51+
/// Set the primary [`Level`] for this [`Group`].
52+
///
53+
/// If not specified, use the [`Level`] of the first element in a [`Group`]
54+
/// if it is a [`Title`]. If not it will default to [`Level::ERROR`].
55+
pub fn primary_level(mut self, level: Level<'a>) -> Self {
56+
self.primary_level = Some(level);
57+
self
58+
}
59+
4760
pub fn is_empty(&self) -> bool {
4861
self.elements.is_empty()
4962
}
@@ -263,6 +276,8 @@ impl<'a> Annotation<'a> {
263276
#[non_exhaustive]
264277
pub enum AnnotationKind {
265278
/// Match the primary [`Level`] of the group.
279+
///
280+
/// See [`Group::primary_level`] for details about how this is determined
266281
Primary,
267282
/// Additional context to explain the [`Primary`][Self::Primary]
268283
/// [`Annotation`]

0 commit comments

Comments
 (0)