|
166 | 166 | <span id="164">164</span>
|
167 | 167 | <span id="165">165</span>
|
168 | 168 | <span id="166">166</span>
|
| 169 | +<span id="167">167</span> |
| 170 | +<span id="168">168</span> |
| 171 | +<span id="169">169</span> |
| 172 | +<span id="170">170</span> |
| 173 | +<span id="171">171</span> |
| 174 | +<span id="172">172</span> |
| 175 | +<span id="173">173</span> |
| 176 | +<span id="174">174</span> |
| 177 | +<span id="175">175</span> |
| 178 | +<span id="176">176</span> |
| 179 | +<span id="177">177</span> |
| 180 | +<span id="178">178</span> |
| 181 | +<span id="179">179</span> |
| 182 | +<span id="180">180</span> |
| 183 | +<span id="181">181</span> |
| 184 | +<span id="182">182</span> |
| 185 | +<span id="183">183</span> |
| 186 | +<span id="184">184</span> |
| 187 | +<span id="185">185</span> |
| 188 | +<span id="186">186</span> |
169 | 189 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
170 | 190 | <span class="comment">// *</span>
|
171 | 191 | <span class="comment">// * For the full copyright and license information, please view the LICENSE</span>
|
|
223 | 243 | <span class="ident">Capacity</span>,
|
224 | 244 | }
|
225 | 245 |
|
| 246 | +<span class="doccomment">/// An error while defining which columns to display in the output table.</span> |
| 247 | +<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span> |
| 248 | +<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">enum</span> <span class="ident">ColumnError</span> { |
| 249 | + <span class="doccomment">/// If a column appears more than once in the `--output` argument.</span> |
| 250 | + <span class="ident">MultipleColumns</span>(<span class="ident">String</span>), |
| 251 | +} |
| 252 | + |
226 | 253 | <span class="kw">impl</span> <span class="ident">Column</span> {
|
227 | 254 | <span class="doccomment">/// Convert from command-line arguments to sequence of columns.</span>
|
228 | 255 | <span class="doccomment">///</span>
|
229 | 256 | <span class="doccomment">/// The set of columns that will appear in the output table can be</span>
|
230 | 257 | <span class="doccomment">/// specified by command-line arguments. This function converts</span>
|
231 | 258 | <span class="doccomment">/// those arguments to a [`Vec`] of [`Column`] variants.</span>
|
232 |
| - <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">from_matches</span>(<span class="ident">matches</span>: <span class="kw-2">&</span><span class="ident">ArgMatches</span>) -> <span class="ident">Vec</span><span class="op"><</span><span class="self">Self</span><span class="op">></span> { |
| 259 | + <span class="doccomment">///</span> |
| 260 | + <span class="doccomment">/// # Errors</span> |
| 261 | + <span class="doccomment">///</span> |
| 262 | + <span class="doccomment">/// This function returns an error if a column is specified more</span> |
| 263 | + <span class="doccomment">/// than once in the command-line argument.</span> |
| 264 | + <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn</span> <span class="ident">from_matches</span>(<span class="ident">matches</span>: <span class="kw-2">&</span><span class="ident">ArgMatches</span>) -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="self">Self</span><span class="op">></span>, <span class="ident">ColumnError</span><span class="op">></span> { |
233 | 265 | <span class="kw">match</span> (
|
234 | 266 | <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_PRINT_TYPE</span>),
|
235 | 267 | <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_INODES</span>),
|
236 | 268 | <span class="ident">matches</span>.<span class="ident">occurrences_of</span>(<span class="ident">OPT_OUTPUT</span>) <span class="op">></span> <span class="number">0</span>,
|
237 | 269 | ) {
|
238 |
| - (<span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) => <span class="macro">vec!</span>[ |
| 270 | + (<span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) => <span class="prelude-val">Ok</span>(<span class="macro">vec!</span>[ |
239 | 271 | <span class="ident"><span class="self">Self</span>::Source</span>,
|
240 | 272 | <span class="ident"><span class="self">Self</span>::Size</span>,
|
241 | 273 | <span class="ident"><span class="self">Self</span>::Used</span>,
|
|
244 | 276 | <span class="ident"><span class="self">Self</span>::Capacity</span>,
|
245 | 277 | <span class="ident"><span class="self">Self</span>::Pcent</span>,
|
246 | 278 | <span class="ident"><span class="self">Self</span>::Target</span>,
|
247 |
| - ], |
| 279 | + ]), |
248 | 280 | (<span class="bool-val">false</span>, <span class="bool-val">false</span>, <span class="bool-val">true</span>) => {
|
249 |
| - <span class="ident">matches</span> |
250 |
| - .<span class="ident">values_of</span>(<span class="ident">OPT_OUTPUT</span>) |
251 |
| - .<span class="ident">unwrap</span>() |
252 |
| - .<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> { |
253 |
| - <span class="comment">// Unwrapping here should not panic because the</span> |
254 |
| - <span class="comment">// command-line argument parsing library should be</span> |
255 |
| - <span class="comment">// responsible for ensuring each comma-separated</span> |
256 |
| - <span class="comment">// string is a valid column label.</span> |
257 |
| - <span class="ident"><span class="self">Self</span>::parse</span>(<span class="ident">s</span>).<span class="ident">unwrap</span>() |
258 |
| - }) |
259 |
| - .<span class="ident">collect</span>() |
| 281 | + <span class="comment">// Unwrapping should not panic because in this arm of</span> |
| 282 | + <span class="comment">// the `match` statement, we know that `OPT_OUTPUT`</span> |
| 283 | + <span class="comment">// is non-empty.</span> |
| 284 | + <span class="kw">let</span> <span class="ident">names</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">values_of</span>(<span class="ident">OPT_OUTPUT</span>).<span class="ident">unwrap</span>(); |
| 285 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">seen</span>: <span class="ident">Vec</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span> <span class="op">=</span> <span class="macro">vec!</span>[]; |
| 286 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">columns</span> <span class="op">=</span> <span class="macro">vec!</span>[]; |
| 287 | + <span class="kw">for</span> <span class="ident">name</span> <span class="kw">in</span> <span class="ident">names</span> { |
| 288 | + <span class="kw">if</span> <span class="ident">seen</span>.<span class="ident">contains</span>(<span class="kw-2">&</span><span class="ident">name</span>) { |
| 289 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ColumnError::MultipleColumns</span>(<span class="ident">name</span>.<span class="ident">to_string</span>())); |
| 290 | + } |
| 291 | + <span class="ident">seen</span>.<span class="ident">push</span>(<span class="ident">name</span>); |
| 292 | + <span class="comment">// Unwrapping here should not panic because the</span> |
| 293 | + <span class="comment">// command-line argument parsing library should be</span> |
| 294 | + <span class="comment">// responsible for ensuring each comma-separated</span> |
| 295 | + <span class="comment">// string is a valid column label.</span> |
| 296 | + <span class="kw">let</span> <span class="ident">column</span> <span class="op">=</span> <span class="ident"><span class="self">Self</span>::parse</span>(<span class="ident">name</span>).<span class="ident">unwrap</span>(); |
| 297 | + <span class="ident">columns</span>.<span class="ident">push</span>(<span class="ident">column</span>); |
| 298 | + } |
| 299 | + <span class="prelude-val">Ok</span>(<span class="ident">columns</span>) |
260 | 300 | }
|
261 |
| - (<span class="bool-val">false</span>, <span class="bool-val">true</span>, <span class="bool-val">false</span>) => <span class="macro">vec!</span>[ |
| 301 | + (<span class="bool-val">false</span>, <span class="bool-val">true</span>, <span class="bool-val">false</span>) => <span class="prelude-val">Ok</span>(<span class="macro">vec!</span>[ |
262 | 302 | <span class="ident"><span class="self">Self</span>::Source</span>,
|
263 | 303 | <span class="ident"><span class="self">Self</span>::Itotal</span>,
|
264 | 304 | <span class="ident"><span class="self">Self</span>::Iused</span>,
|
265 | 305 | <span class="ident"><span class="self">Self</span>::Iavail</span>,
|
266 | 306 | <span class="ident"><span class="self">Self</span>::Ipcent</span>,
|
267 | 307 | <span class="ident"><span class="self">Self</span>::Target</span>,
|
268 |
| - ], |
269 |
| - (<span class="bool-val">true</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) => <span class="macro">vec!</span>[ |
| 308 | + ]), |
| 309 | + (<span class="bool-val">true</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>) => <span class="prelude-val">Ok</span>(<span class="macro">vec!</span>[ |
270 | 310 | <span class="ident"><span class="self">Self</span>::Source</span>,
|
271 | 311 | <span class="ident"><span class="self">Self</span>::Fstype</span>,
|
272 | 312 | <span class="ident"><span class="self">Self</span>::Size</span>,
|
|
276 | 316 | <span class="ident"><span class="self">Self</span>::Capacity</span>,
|
277 | 317 | <span class="ident"><span class="self">Self</span>::Pcent</span>,
|
278 | 318 | <span class="ident"><span class="self">Self</span>::Target</span>,
|
279 |
| - ], |
280 |
| - (<span class="bool-val">true</span>, <span class="bool-val">true</span>, <span class="bool-val">false</span>) => <span class="macro">vec!</span>[ |
| 319 | + ]), |
| 320 | + (<span class="bool-val">true</span>, <span class="bool-val">true</span>, <span class="bool-val">false</span>) => <span class="prelude-val">Ok</span>(<span class="macro">vec!</span>[ |
281 | 321 | <span class="ident"><span class="self">Self</span>::Source</span>,
|
282 | 322 | <span class="ident"><span class="self">Self</span>::Fstype</span>,
|
283 | 323 | <span class="ident"><span class="self">Self</span>::Itotal</span>,
|
284 | 324 | <span class="ident"><span class="self">Self</span>::Iused</span>,
|
285 | 325 | <span class="ident"><span class="self">Self</span>::Iavail</span>,
|
286 | 326 | <span class="ident"><span class="self">Self</span>::Ipcent</span>,
|
287 | 327 | <span class="ident"><span class="self">Self</span>::Target</span>,
|
288 |
| - ], |
| 328 | + ]), |
289 | 329 | <span class="comment">// The command-line arguments -T and -i are each mutually</span>
|
290 | 330 | <span class="comment">// exclusive with --output, so the command-line argument</span>
|
291 | 331 | <span class="comment">// parser should reject those combinations before we get</span>
|
|
0 commit comments