• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rust-lang / annotate-snippets-rs / 16610026059

29 Jul 2025 11:56PM UTC coverage: 87.388% (-0.7%) from 88.087%
16610026059

push

github

web-flow
Merge pull request #258 from Muscraft/keep-lines

feat: Add a way to keep lines with no annotations

8 of 20 new or added lines in 1 file covered. (40.0%)

2 existing lines in 1 file now uncovered.

1469 of 1681 relevant lines covered (87.39%)

4.33 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.12
/src/renderer/margin.rs
1
use std::cmp::{max, min};
2

3
const ELLIPSIS_PASSING: usize = 6;
4
const LONG_WHITESPACE: usize = 20;
5
const LONG_WHITESPACE_PADDING: usize = 4;
6

7
#[derive(Clone, Copy, Debug, PartialEq)]
8
pub(crate) struct Margin {
9
    /// The available whitespace in the left that can be consumed when centering.
10
    whitespace_left: usize,
11
    /// The column of the beginning of left-most span.
12
    span_left: usize,
13
    /// The column of the end of right-most span.
14
    span_right: usize,
15
    /// The beginning of the line to be displayed.
16
    computed_left: usize,
17
    /// The end of the line to be displayed.
18
    computed_right: usize,
19
    /// The current width of the terminal. 140 by default and in tests.
20
    pub(crate) term_width: usize,
21
    /// The end column of a span label, including the span. Doesn't account for labels not in the
22
    /// same line as the span.
23
    label_right: usize,
24
}
25

26
impl Margin {
27
    pub(crate) fn new(
4✔
28
        whitespace_left: usize,
29
        span_left: usize,
30
        span_right: usize,
31
        label_right: usize,
32
        term_width: usize,
33
        max_line_len: usize,
34
    ) -> Self {
35
        // The 6 is padding to give a bit of room for `...` when displaying:
36
        // ```
37
        // error: message
38
        //   --> file.rs:16:58
39
        //    |
40
        // 16 | ... fn foo(self) -> Self::Bar {
41
        //    |                     ^^^^^^^^^
42
        // ```
43

44
        let mut m = Margin {
UNCOV
45
            whitespace_left: whitespace_left.saturating_sub(ELLIPSIS_PASSING),
×
UNCOV
46
            span_left: span_left.saturating_sub(ELLIPSIS_PASSING),
×
47
            span_right: span_right + ELLIPSIS_PASSING,
8✔
48
            computed_left: 0,
49
            computed_right: 0,
50
            term_width,
51
            label_right: label_right + ELLIPSIS_PASSING,
4✔
52
        };
53
        m.compute(max_line_len);
8✔
54
        m
8✔
55
    }
56

57
    pub(crate) fn was_cut_left(&self) -> bool {
6✔
58
        self.computed_left > 0
6✔
59
    }
60

61
    fn compute(&mut self, max_line_len: usize) {
4✔
62
        // When there's a lot of whitespace (>20), we want to trim it as it is useless.
63
        self.computed_left = if self.whitespace_left > LONG_WHITESPACE {
21✔
64
            self.whitespace_left - (LONG_WHITESPACE - LONG_WHITESPACE_PADDING) // We want some padding.
2✔
65
        } else {
66
            0
4✔
67
        };
68
        // We want to show as much as possible, max_line_len is the right-most boundary for the
69
        // relevant code.
70
        self.computed_right = max(max_line_len, self.computed_left);
5✔
71

72
        if self.computed_right - self.computed_left > self.term_width {
12✔
73
            // Trimming only whitespace isn't enough, let's get craftier.
74
            if self.label_right - self.whitespace_left <= self.term_width {
5✔
75
                // Attempt to fit the code window only trimming whitespace.
76
                self.computed_left = self.whitespace_left;
1✔
77
                self.computed_right = self.computed_left + self.term_width;
2✔
78
            } else if self.label_right - self.span_left <= self.term_width {
12✔
79
                // Attempt to fit the code window considering only the spans and labels.
80
                let padding_left = (self.term_width - (self.label_right - self.span_left)) / 2;
8✔
81
                self.computed_left = self.span_left.saturating_sub(padding_left);
6✔
82
                self.computed_right = self.computed_left + self.term_width;
6✔
83
            } else if self.span_right - self.span_left <= self.term_width {
8✔
84
                // Attempt to fit the code window considering the spans and labels plus padding.
85
                let padding_left = (self.term_width - (self.span_right - self.span_left)) / 5 * 2;
2✔
86
                self.computed_left = self.span_left.saturating_sub(padding_left);
4✔
87
                self.computed_right = self.computed_left + self.term_width;
4✔
88
            } else {
89
                // Mostly give up but still don't show the full line.
90
                self.computed_left = self.span_left;
2✔
91
                self.computed_right = self.span_right;
1✔
92
            }
93
        }
94
    }
95

96
    pub(crate) fn left(&self, line_len: usize) -> usize {
6✔
97
        min(self.computed_left, line_len)
6✔
98
    }
99

100
    pub(crate) fn right(&self, line_len: usize) -> usize {
7✔
101
        if line_len.saturating_sub(self.computed_left) <= self.term_width {
12✔
102
            line_len
6✔
103
        } else {
104
            min(line_len, self.computed_right)
3✔
105
        }
106
    }
107
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc