Coverage Report

Created: 2025-02-21 07:11

/rust/registry/src/index.crates.io-6f17d22bba15001f/semver-1.0.25/src/display.rs
Line
Count
Source (jump to first uncovered line)
1
use crate::{BuildMetadata, Comparator, Op, Prerelease, Version, VersionReq};
2
use core::fmt::{self, Alignment, Debug, Display, Write};
3
4
impl Display for Version {
5
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
6
0
        let do_display = |formatter: &mut fmt::Formatter| -> fmt::Result {
7
0
            write!(formatter, "{}.{}.{}", self.major, self.minor, self.patch)?;
8
0
            if !self.pre.is_empty() {
9
0
                write!(formatter, "-{}", self.pre)?;
10
0
            }
11
0
            if !self.build.is_empty() {
12
0
                write!(formatter, "+{}", self.build)?;
13
0
            }
14
0
            Ok(())
15
0
        };
16
17
0
        let do_len = || -> usize {
18
0
            digits(self.major)
19
0
                + 1
20
0
                + digits(self.minor)
21
0
                + 1
22
0
                + digits(self.patch)
23
0
                + !self.pre.is_empty() as usize
24
0
                + self.pre.len()
25
0
                + !self.build.is_empty() as usize
26
0
                + self.build.len()
27
0
        };
28
29
0
        pad(formatter, do_display, do_len)
30
0
    }
31
}
32
33
impl Display for VersionReq {
34
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
35
0
        if self.comparators.is_empty() {
36
0
            return formatter.write_str("*");
37
0
        }
38
0
        for (i, comparator) in self.comparators.iter().enumerate() {
39
0
            if i > 0 {
40
0
                formatter.write_str(", ")?;
41
0
            }
42
0
            write!(formatter, "{}", comparator)?;
43
        }
44
0
        Ok(())
45
0
    }
46
}
47
48
impl Display for Comparator {
49
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
50
0
        let op = match self.op {
51
0
            Op::Exact => "=",
52
0
            Op::Greater => ">",
53
0
            Op::GreaterEq => ">=",
54
0
            Op::Less => "<",
55
0
            Op::LessEq => "<=",
56
0
            Op::Tilde => "~",
57
0
            Op::Caret => "^",
58
0
            Op::Wildcard => "",
59
            #[cfg(no_non_exhaustive)]
60
            Op::__NonExhaustive => unreachable!(),
61
        };
62
0
        formatter.write_str(op)?;
63
0
        write!(formatter, "{}", self.major)?;
64
0
        if let Some(minor) = &self.minor {
65
0
            write!(formatter, ".{}", minor)?;
66
0
            if let Some(patch) = &self.patch {
67
0
                write!(formatter, ".{}", patch)?;
68
0
                if !self.pre.is_empty() {
69
0
                    write!(formatter, "-{}", self.pre)?;
70
0
                }
71
0
            } else if self.op == Op::Wildcard {
72
0
                formatter.write_str(".*")?;
73
0
            }
74
0
        } else if self.op == Op::Wildcard {
75
0
            formatter.write_str(".*")?;
76
0
        }
77
0
        Ok(())
78
0
    }
79
}
80
81
impl Display for Prerelease {
82
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
83
0
        formatter.write_str(self.as_str())
84
0
    }
85
}
86
87
impl Display for BuildMetadata {
88
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
89
0
        formatter.write_str(self.as_str())
90
0
    }
91
}
92
93
impl Debug for Version {
94
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
95
0
        let mut debug = formatter.debug_struct("Version");
96
0
        debug
97
0
            .field("major", &self.major)
98
0
            .field("minor", &self.minor)
99
0
            .field("patch", &self.patch);
100
0
        if !self.pre.is_empty() {
101
0
            debug.field("pre", &self.pre);
102
0
        }
103
0
        if !self.build.is_empty() {
104
0
            debug.field("build", &self.build);
105
0
        }
106
0
        debug.finish()
107
0
    }
108
}
109
110
impl Debug for Prerelease {
111
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
112
0
        write!(formatter, "Prerelease(\"{}\")", self)
113
0
    }
114
}
115
116
impl Debug for BuildMetadata {
117
0
    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
118
0
        write!(formatter, "BuildMetadata(\"{}\")", self)
119
0
    }
120
}
121
122
0
fn pad(
123
0
    formatter: &mut fmt::Formatter,
124
0
    do_display: impl FnOnce(&mut fmt::Formatter) -> fmt::Result,
125
0
    do_len: impl FnOnce() -> usize,
126
0
) -> fmt::Result {
127
0
    let min_width = match formatter.width() {
128
0
        Some(min_width) => min_width,
129
0
        None => return do_display(formatter),
130
    };
131
132
0
    let len = do_len();
133
0
    if len >= min_width {
134
0
        return do_display(formatter);
135
0
    }
136
0
137
0
    let default_align = Alignment::Left;
138
0
    let align = formatter.align().unwrap_or(default_align);
139
0
    let padding = min_width - len;
140
0
    let (pre_pad, post_pad) = match align {
141
0
        Alignment::Left => (0, padding),
142
0
        Alignment::Right => (padding, 0),
143
0
        Alignment::Center => (padding / 2, (padding + 1) / 2),
144
    };
145
146
0
    let fill = formatter.fill();
147
0
    for _ in 0..pre_pad {
148
0
        formatter.write_char(fill)?;
149
    }
150
151
0
    do_display(formatter)?;
152
153
0
    for _ in 0..post_pad {
154
0
        formatter.write_char(fill)?;
155
    }
156
0
    Ok(())
157
0
}
158
159
0
fn digits(val: u64) -> usize {
160
0
    if val < 10 {
161
0
        1
162
    } else {
163
0
        1 + digits(val / 10)
164
    }
165
0
}