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

rust-lang / annotate-snippets-rs / 30237167983

27 Jul 2026 04:27AM UTC coverage: 91.797% (+0.7%) from 91.13%
30237167983

Pull #443

github

web-flow
Merge 688e653a5 into 52add15aa
Pull Request #443: feat: Add no graphics renderer mode

144 of 148 new or added lines in 3 files covered. (97.3%)

2 existing lines in 1 file now uncovered.

1645 of 1792 relevant lines covered (91.8%)

6.51 hits per line

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

88.57
/src/renderer/margin.rs
1
use core::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(
10✔
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,
9✔
48
            computed_left: 0,
49
            computed_right: 0,
50
            term_width,
51
            label_right: label_right + ELLIPSIS_PASSING,
10✔
52
        };
53
        m.compute(max_line_len);
9✔
54
        m
8✔
55
    }
56

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

61
    fn compute(&mut self, max_line_len: usize) {
10✔
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 {
30✔
64
            self.whitespace_left - (LONG_WHITESPACE - LONG_WHITESPACE_PADDING) // We want some padding.
4✔
65
        } else {
66
            0
10✔
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);
9✔
71

72
        if self.computed_right - self.computed_left > self.term_width {
19✔
73
            // Trimming only whitespace isn't enough, let's get craftier.
74
            if self.label_right.saturating_sub(self.whitespace_left) <= self.term_width
6✔
75
                // Trimming whitespace when the right-most label is somewhrere
76
                // within it would result in the label pointing to the wrong
77
                // place
78
                && self.label_right >= self.whitespace_left
1✔
79
            {
80
                // Attempt to fit the code window only trimming whitespace.
81
                self.computed_left = self.whitespace_left;
×
82
                self.computed_right = self.computed_left + self.term_width;
×
83
            } else if self.label_right - self.span_left <= self.term_width {
9✔
84
                // Attempt to fit the code window considering only the spans and labels.
85
                let padding_left = (self.term_width - (self.label_right - self.span_left)) / 2;
6✔
86
                self.computed_left = self.span_left.saturating_sub(padding_left);
6✔
87
                self.computed_right = self.computed_left + self.term_width;
6✔
88
            } else if self.span_right - self.span_left <= self.term_width {
8✔
89
                // Attempt to fit the code window considering the spans and labels plus padding.
90
                let padding_left = (self.term_width - (self.span_right - self.span_left)) / 5 * 2;
2✔
91
                self.computed_left = self.span_left.saturating_sub(padding_left);
4✔
92
                self.computed_right = self.computed_left + self.term_width;
4✔
93
            } else {
94
                // Mostly give up but still don't show the full line.
95
                self.computed_left = self.span_left;
2✔
96
                self.computed_right = self.span_right;
2✔
97
            }
98
        }
99
    }
100

101
    pub(crate) fn left(&self, line_len: usize) -> usize {
7✔
102
        min(self.computed_left, line_len)
7✔
103
    }
104

105
    pub(crate) fn right(&self, line_len: usize) -> usize {
8✔
106
        if line_len.saturating_sub(self.computed_left) <= self.term_width {
14✔
107
            line_len
5✔
108
        } else {
109
            min(line_len, self.computed_right)
3✔
110
        }
111
    }
112
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc