|
354 | 354 | <span id="349">349</span>
|
355 | 355 | <span id="350">350</span>
|
356 | 356 | <span id="351">351</span>
|
| 357 | +<span id="352">352</span> |
| 358 | +<span id="353">353</span> |
| 359 | +<span id="354">354</span> |
| 360 | +<span id="355">355</span> |
| 361 | +<span id="356">356</span> |
| 362 | +<span id="357">357</span> |
| 363 | +<span id="358">358</span> |
| 364 | +<span id="359">359</span> |
| 365 | +<span id="360">360</span> |
| 366 | +<span id="361">361</span> |
| 367 | +<span id="362">362</span> |
| 368 | +<span id="363">363</span> |
| 369 | +<span id="364">364</span> |
| 370 | +<span id="365">365</span> |
| 371 | +<span id="366">366</span> |
| 372 | +<span id="367">367</span> |
| 373 | +<span id="368">368</span> |
| 374 | +<span id="369">369</span> |
| 375 | +<span id="370">370</span> |
| 376 | +<span id="371">371</span> |
| 377 | +<span id="372">372</span> |
| 378 | +<span id="373">373</span> |
| 379 | +<span id="374">374</span> |
| 380 | +<span id="375">375</span> |
| 381 | +<span id="376">376</span> |
| 382 | +<span id="377">377</span> |
| 383 | +<span id="378">378</span> |
| 384 | +<span id="379">379</span> |
| 385 | +<span id="380">380</span> |
357 | 386 | </pre><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.</span>
|
358 | 387 | <span class="comment">// *</span>
|
359 | 388 | <span class="comment">// * (c) Virgile Andreani <virgile.andreani@anbuco.fr></span>
|
|
368 | 397 | <span class="attribute">#[<span class="ident">macro_use</span>]</span>
|
369 | 398 | <span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">uucore</span>;
|
370 | 399 | <span class="kw">use</span> <span class="ident">clap</span>::{<span class="ident">crate_version</span>, <span class="ident">Arg</span>, <span class="ident">Command</span>};
|
| 400 | +<span class="kw">use</span> <span class="ident">std::error::Error</span>; |
| 401 | +<span class="kw">use</span> <span class="ident">std::fmt</span>; |
371 | 402 | <span class="kw">use</span> <span class="ident">std::fs::File</span>;
|
372 | 403 | <span class="kw">use</span> <span class="ident">std::io</span>::{<span class="ident">stdin</span>, <span class="ident">stdout</span>, <span class="ident">BufRead</span>, <span class="ident">BufReader</span>, <span class="ident">BufWriter</span>, <span class="ident">Read</span>, <span class="ident">Stdout</span>, <span class="ident">Write</span>};
|
373 | 404 | <span class="kw">use</span> <span class="ident">std::str::from_utf8</span>;
|
374 | 405 | <span class="kw">use</span> <span class="ident">unicode_width::UnicodeWidthChar</span>;
|
375 | 406 | <span class="kw">use</span> <span class="ident">uucore::display::Quotable</span>;
|
376 |
| -<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UResult</span>}; |
| 407 | +<span class="kw">use</span> <span class="ident">uucore::error</span>::{<span class="ident">FromIo</span>, <span class="ident">UError</span>, <span class="ident">UResult</span>}; |
377 | 408 | <span class="kw">use</span> <span class="ident">uucore</span>::{<span class="ident">format_usage</span>, <span class="ident">InvalidEncodingHandling</span>};
|
378 | 409 |
|
379 | 410 | <span class="kw">static</span> <span class="ident">NAME</span>: <span class="kw-2">&</span><span class="ident">str</span> <span class="op">=</span> <span class="string">"unexpand"</span>;
|
|
383 | 414 |
|
384 | 415 | <span class="kw">const</span> <span class="ident">DEFAULT_TABSTOP</span>: <span class="ident">usize</span> <span class="op">=</span> <span class="number">8</span>;
|
385 | 416 |
|
386 |
| -<span class="kw">fn</span> <span class="ident">tabstops_parse</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">Vec</span><span class="op"><</span><span class="ident">usize</span><span class="op">></span> { |
| 417 | +<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>)]</span> |
| 418 | +<span class="kw">enum</span> <span class="ident">ParseError</span> { |
| 419 | + <span class="ident">InvalidCharacter</span>(<span class="ident">String</span>), |
| 420 | + <span class="ident">TabSizeCannotBeZero</span>, |
| 421 | + <span class="ident">TabSizesMustBeAscending</span>, |
| 422 | +} |
| 423 | + |
| 424 | +<span class="kw">impl</span> <span class="ident">Error</span> <span class="kw">for</span> <span class="ident">ParseError</span> {} |
| 425 | +<span class="kw">impl</span> <span class="ident">UError</span> <span class="kw">for</span> <span class="ident">ParseError</span> {} |
| 426 | + |
| 427 | +<span class="kw">impl</span> <span class="ident">fmt::Display</span> <span class="kw">for</span> <span class="ident">ParseError</span> { |
| 428 | + <span class="kw">fn</span> <span class="ident">fmt</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">f</span>: <span class="kw-2">&mut</span> <span class="ident">fmt::Formatter</span>) -> <span class="ident">fmt::Result</span> { |
| 429 | + <span class="kw">match</span> <span class="self">self</span> { |
| 430 | + <span class="ident"><span class="self">Self</span>::InvalidCharacter</span>(<span class="ident">s</span>) => { |
| 431 | + <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"tab size contains invalid character(s): {}"</span>, <span class="ident">s</span>.<span class="ident">quote</span>()) |
| 432 | + } |
| 433 | + <span class="ident"><span class="self">Self</span>::TabSizeCannotBeZero</span> => <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"tab size cannot be 0"</span>), |
| 434 | + <span class="ident"><span class="self">Self</span>::TabSizesMustBeAscending</span> => <span class="macro">write!</span>(<span class="ident">f</span>, <span class="string">"tab sizes must be ascending"</span>), |
| 435 | + } |
| 436 | + } |
| 437 | +} |
| 438 | + |
| 439 | +<span class="kw">fn</span> <span class="ident">tabstops_parse</span>(<span class="ident">s</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">usize</span><span class="op">></span>, <span class="ident">ParseError</span><span class="op">></span> { |
387 | 440 | <span class="kw">let</span> <span class="ident">words</span> <span class="op">=</span> <span class="ident">s</span>.<span class="ident">split</span>(<span class="string">','</span>);
|
388 | 441 |
|
389 |
| - <span class="kw">let</span> <span class="ident">nums</span> <span class="op">=</span> <span class="ident">words</span> |
390 |
| - .<span class="ident">map</span>(<span class="op">|</span><span class="ident">sn</span><span class="op">|</span> { |
391 |
| - <span class="ident">sn</span>.<span class="ident">parse</span>() |
392 |
| - .<span class="ident">unwrap_or_else</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="macro">crash!</span>(<span class="number">1</span>, <span class="string">"{}\n"</span>, <span class="string">"tab size contains invalid character(s)"</span>)) |
393 |
| - }) |
394 |
| - .<span class="ident">collect</span>::<span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">usize</span><span class="op">></span><span class="op">></span>(); |
| 442 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">nums</span> <span class="op">=</span> <span class="ident">Vec::new</span>(); |
| 443 | + |
| 444 | + <span class="kw">for</span> <span class="ident">word</span> <span class="kw">in</span> <span class="ident">words</span> { |
| 445 | + <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Ok</span>(<span class="ident">num</span>) <span class="op">=</span> <span class="ident">word</span>.<span class="ident">parse</span>() { |
| 446 | + <span class="ident">nums</span>.<span class="ident">push</span>(<span class="ident">num</span>); |
| 447 | + } <span class="kw">else</span> { |
| 448 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ParseError::InvalidCharacter</span>( |
| 449 | + <span class="ident">word</span>.<span class="ident">trim_start_matches</span>(<span class="ident">char::is_numeric</span>).<span class="ident">to_string</span>(), |
| 450 | + )); |
| 451 | + } |
| 452 | + } |
395 | 453 |
|
396 | 454 | <span class="kw">if</span> <span class="ident">nums</span>.<span class="ident">iter</span>().<span class="ident">any</span>(<span class="op">|</span><span class="kw-2">&</span><span class="ident">n</span><span class="op">|</span> <span class="ident">n</span> <span class="op">==</span> <span class="number">0</span>) {
|
397 |
| - <span class="macro">crash!</span>(<span class="number">1</span>, <span class="string">"{}\n"</span>, <span class="string">"tab size cannot be 0"</span>); |
| 455 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ParseError::TabSizeCannotBeZero</span>); |
398 | 456 | }
|
399 | 457 |
|
400 | 458 | <span class="kw">if</span> <span class="kw">let</span> (<span class="bool-val">false</span>, <span class="kw">_</span>) <span class="op">=</span> <span class="ident">nums</span>
|
401 | 459 | .<span class="ident">iter</span>()
|
402 |
| - .<span class="ident">fold</span>((<span class="bool-val">true</span>, <span class="number">0</span>), <span class="op">|</span>(<span class="ident">acc</span>, <span class="ident">last</span>), <span class="kw-2">&</span><span class="ident">n</span><span class="op">|</span> (<span class="ident">acc</span> <span class="op">&&</span> <span class="ident">last</span> <span class="op"><</span><span class="op">=</span> <span class="ident">n</span>, <span class="ident">n</span>)) |
| 460 | + .<span class="ident">fold</span>((<span class="bool-val">true</span>, <span class="number">0</span>), <span class="op">|</span>(<span class="ident">acc</span>, <span class="ident">last</span>), <span class="kw-2">&</span><span class="ident">n</span><span class="op">|</span> (<span class="ident">acc</span> <span class="op">&&</span> <span class="ident">last</span> <span class="op"><</span> <span class="ident">n</span>, <span class="ident">n</span>)) |
403 | 461 | {
|
404 |
| - <span class="macro">crash!</span>(<span class="number">1</span>, <span class="string">"{}\n"</span>, <span class="string">"tab sizes must be ascending"</span>); |
| 462 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">ParseError::TabSizesMustBeAscending</span>); |
405 | 463 | }
|
406 | 464 |
|
407 |
| - <span class="ident">nums</span> |
| 465 | + <span class="prelude-val">Ok</span>(<span class="ident">nums</span>) |
408 | 466 | }
|
409 | 467 |
|
410 | 468 | <span class="kw">mod</span> <span class="ident">options</span> {
|
|
423 | 481 | }
|
424 | 482 |
|
425 | 483 | <span class="kw">impl</span> <span class="ident">Options</span> {
|
426 |
| - <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">matches</span>: <span class="kw-2">&</span><span class="ident">clap::ArgMatches</span>) -> <span class="self">Self</span> { |
| 484 | + <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">matches</span>: <span class="kw-2">&</span><span class="ident">clap::ArgMatches</span>) -> <span class="prelude-ty">Result</span><span class="op"><</span><span class="self">Self</span>, <span class="ident">ParseError</span><span class="op">></span> { |
427 | 485 | <span class="kw">let</span> <span class="ident">tabstops</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">matches</span>.<span class="ident">value_of</span>(<span class="ident">options::TABS</span>) {
|
428 | 486 | <span class="prelude-val">None</span> => <span class="macro">vec!</span>[<span class="ident">DEFAULT_TABSTOP</span>],
|
429 |
| - <span class="prelude-val">Some</span>(<span class="ident">s</span>) => <span class="ident">tabstops_parse</span>(<span class="ident">s</span>), |
| 487 | + <span class="prelude-val">Some</span>(<span class="ident">s</span>) => <span class="ident">tabstops_parse</span>(<span class="ident">s</span>)<span class="question-mark">?</span>, |
430 | 488 | };
|
431 | 489 |
|
432 | 490 | <span class="kw">let</span> <span class="ident">aflag</span> <span class="op">=</span> (<span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::ALL</span>) <span class="op">|</span><span class="op">|</span> <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">options::TABS</span>))
|
|
438 | 496 | <span class="prelude-val">None</span> => <span class="macro">vec!</span>[<span class="string">"-"</span>.<span class="ident">to_owned</span>()],
|
439 | 497 | };
|
440 | 498 |
|
441 |
| - <span class="self">Self</span> { |
| 499 | + <span class="prelude-val">Ok</span>(<span class="self">Self</span> { |
442 | 500 | <span class="ident">files</span>,
|
443 | 501 | <span class="ident">tabstops</span>,
|
444 | 502 | <span class="ident">aflag</span>,
|
445 | 503 | <span class="ident">uflag</span>,
|
446 |
| - } |
| 504 | + }) |
447 | 505 | }
|
448 | 506 | }
|
449 | 507 |
|
|
455 | 513 |
|
456 | 514 | <span class="kw">let</span> <span class="ident">matches</span> <span class="op">=</span> <span class="ident">uu_app</span>().<span class="ident">get_matches_from</span>(<span class="ident">args</span>);
|
457 | 515 |
|
458 |
| - <span class="ident">unexpand</span>(<span class="kw-2">&</span><span class="ident">Options::new</span>(<span class="kw-2">&</span><span class="ident">matches</span>)).<span class="ident">map_err_context</span>(<span class="ident">String::new</span>) |
| 516 | + <span class="ident">unexpand</span>(<span class="kw-2">&</span><span class="ident">Options::new</span>(<span class="kw-2">&</span><span class="ident">matches</span>)<span class="question-mark">?</span>).<span class="ident">map_err_context</span>(<span class="ident">String::new</span>) |
459 | 517 | }
|
460 | 518 |
|
461 | 519 | <span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">uu_app</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span>() -> <span class="ident">Command</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
|
0 commit comments