/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 | } |