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

rust-lang / annotate-snippets-rs / 16806206555

07 Aug 2025 01:41PM UTC coverage: 87.619% (-0.4%) from 87.995%
16806206555

push

github

web-flow
chore(deps): Update Rust Stable to v1.89 (#270)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

1472 of 1680 relevant lines covered (87.62%)

4.66 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(
5✔
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 {
45
            whitespace_left: whitespace_left.saturating_sub(ELLIPSIS_PASSING),
×
46
            span_left: span_left.saturating_sub(ELLIPSIS_PASSING),
×
47
            span_right: span_right + ELLIPSIS_PASSING,
7✔
48
            computed_left: 0,
49
            computed_right: 0,
50
            term_width,
51
            label_right: label_right + ELLIPSIS_PASSING,
5✔
52
        };
53
        m.compute(max_line_len);
7✔
54
        m
8✔
55
    }
56

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

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

72
        if self.computed_right - self.computed_left > self.term_width {
15✔
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);
8✔
82
                self.computed_right = self.computed_left + self.term_width;
8✔
83
            } else if self.span_right - self.span_left <= self.term_width {
7✔
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;
1✔
91
                self.computed_right = self.span_right;
1✔
92
            }
93
        }
94
    }
95

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

100
    pub(crate) fn right(&self, line_len: usize) -> usize {
4✔
101
        if line_len.saturating_sub(self.computed_left) <= self.term_width {
12✔
102
            line_len
8✔
103
        } else {
104
            min(line_len, self.computed_right)
4✔
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