|
357 | 357 | <a href="#357" id="357">357</a>
|
358 | 358 | <a href="#358" id="358">358</a>
|
359 | 359 | <a href="#359" id="359">359</a>
|
| 360 | +<a href="#360" id="360">360</a> |
| 361 | +<a href="#361" id="361">361</a> |
| 362 | +<a href="#362" id="362">362</a> |
| 363 | +<a href="#363" id="363">363</a> |
| 364 | +<a href="#364" id="364">364</a> |
| 365 | +<a href="#365" id="365">365</a> |
| 366 | +<a href="#366" id="366">366</a> |
| 367 | +<a href="#367" id="367">367</a> |
| 368 | +<a href="#368" id="368">368</a> |
| 369 | +<a href="#369" id="369">369</a> |
| 370 | +<a href="#370" id="370">370</a> |
| 371 | +<a href="#371" id="371">371</a> |
| 372 | +<a href="#372" id="372">372</a> |
| 373 | +<a href="#373" id="373">373</a> |
| 374 | +<a href="#374" id="374">374</a> |
| 375 | +<a href="#375" id="375">375</a> |
| 376 | +<a href="#376" id="376">376</a> |
| 377 | +<a href="#377" id="377">377</a> |
| 378 | +<a href="#378" id="378">378</a> |
| 379 | +<a href="#379" id="379">379</a> |
| 380 | +<a href="#380" id="380">380</a> |
| 381 | +<a href="#381" id="381">381</a> |
| 382 | +<a href="#382" id="382">382</a> |
| 383 | +<a href="#383" id="383">383</a> |
| 384 | +<a href="#384" id="384">384</a> |
| 385 | +<a href="#385" id="385">385</a> |
| 386 | +<a href="#386" id="386">386</a> |
| 387 | +<a href="#387" id="387">387</a> |
| 388 | +<a href="#388" id="388">388</a> |
| 389 | +<a href="#389" id="389">389</a> |
| 390 | +<a href="#390" id="390">390</a> |
| 391 | +<a href="#391" id="391">391</a> |
| 392 | +<a href="#392" id="392">392</a> |
| 393 | +<a href="#393" id="393">393</a> |
| 394 | +<a href="#394" id="394">394</a> |
360 | 395 | </pre><pre class="rust"><code><span class="comment">// * This file is part of `fmt` from the uutils coreutils package.
|
361 | 396 | // *
|
362 | 397 | // * (c) kwantam <kwantam@gmail.com>
|
|
370 | 405 | <span class="kw">use </span>std::cmp;
|
371 | 406 | <span class="kw">use </span>std::fs::File;
|
372 | 407 | <span class="kw">use </span>std::io::{stdin, stdout, Write};
|
373 |
| -<span class="kw">use </span>std::io::{BufReader, BufWriter, Read}; |
| 408 | +<span class="kw">use </span>std::io::{BufReader, BufWriter, Read, Stdout}; |
374 | 409 | <span class="kw">use </span>uucore::display::Quotable;
|
375 | 410 | <span class="kw">use </span>uucore::error::{FromIo, UResult, USimpleError};
|
376 | 411 | <span class="kw">use </span>uucore::{format_usage, help_about, help_usage, show_warning};
|
|
419 | 454 | goal: usize,
|
420 | 455 | tabwidth: usize,
|
421 | 456 | }
|
422 |
| - |
423 |
| -<span class="attr">#[uucore::main] |
424 |
| -#[allow(clippy::cognitive_complexity)] |
425 |
| -</span><span class="kw">pub fn </span>uumain(args: <span class="kw">impl </span>uucore::Args) -> UResult<()> { |
| 457 | +<span class="doccomment">/// Parse the command line arguments and return the list of files and formatting options. |
| 458 | +/// |
| 459 | +/// # Arguments |
| 460 | +/// |
| 461 | +/// * `args` - Command line arguments. |
| 462 | +/// |
| 463 | +/// # Returns |
| 464 | +/// |
| 465 | +/// A tuple containing a vector of file names and a `FmtOptions` struct. |
| 466 | +</span><span class="kw">fn </span>parse_arguments(args: <span class="kw">impl </span>uucore::Args) -> UResult<(Vec<String>, FmtOptions)> { |
426 | 467 | <span class="kw">let </span>matches = uu_app().try_get_matches_from(args)<span class="question-mark">?</span>;
|
427 | 468 |
|
428 | 469 | <span class="kw">let </span><span class="kw-2">mut </span>files: Vec<String> = matches
|
|
536 | 577 | files.push(<span class="string">"-"</span>.to_owned());
|
537 | 578 | }
|
538 | 579 |
|
539 |
| - <span class="kw">let </span><span class="kw-2">mut </span>ostream = BufWriter::new(stdout()); |
| 580 | + <span class="prelude-val">Ok</span>((files, fmt_opts)) |
| 581 | +} |
540 | 582 |
|
541 |
| - <span class="kw">for </span>i <span class="kw">in </span>files.iter().map(|x| <span class="kw-2">&</span>x[..]) { |
542 |
| - <span class="kw">let </span><span class="kw-2">mut </span>fp = <span class="kw">match </span>i { |
543 |
| - <span class="string">"-" </span>=> BufReader::new(Box::new(stdin()) <span class="kw">as </span>Box<<span class="kw">dyn </span>Read + <span class="lifetime">'static</span>>), |
544 |
| - <span class="kw">_ </span>=> <span class="kw">match </span>File::open(i) { |
545 |
| - <span class="prelude-val">Ok</span>(f) => BufReader::new(Box::new(f) <span class="kw">as </span>Box<<span class="kw">dyn </span>Read + <span class="lifetime">'static</span>>), |
546 |
| - <span class="prelude-val">Err</span>(e) => { |
547 |
| - <span class="macro">show_warning!</span>(<span class="string">"{}: {}"</span>, i.maybe_quote(), e); |
548 |
| - <span class="kw">continue</span>; |
549 |
| - } |
550 |
| - }, |
551 |
| - }; |
552 |
| - <span class="kw">let </span>p_stream = ParagraphStream::new(<span class="kw-2">&</span>fmt_opts, <span class="kw-2">&mut </span>fp); |
553 |
| - <span class="kw">for </span>para_result <span class="kw">in </span>p_stream { |
554 |
| - <span class="kw">match </span>para_result { |
555 |
| - <span class="prelude-val">Err</span>(s) => { |
556 |
| - ostream |
557 |
| - .write_all(s.as_bytes()) |
558 |
| - .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>; |
559 |
| - ostream |
560 |
| - .write_all(<span class="string">b"\n"</span>) |
561 |
| - .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>; |
562 |
| - } |
563 |
| - <span class="prelude-val">Ok</span>(para) => break_lines(<span class="kw-2">&</span>para, <span class="kw-2">&</span>fmt_opts, <span class="kw-2">&mut </span>ostream) |
564 |
| - .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>, |
| 583 | +<span class="doccomment">/// Process the content of a file and format it according to the provided options. |
| 584 | +/// |
| 585 | +/// # Arguments |
| 586 | +/// |
| 587 | +/// * `file_name` - The name of the file to process. A value of "-" represents the standard input. |
| 588 | +/// * `fmt_opts` - A reference to a `FmtOptions` struct containing the formatting options. |
| 589 | +/// * `ostream` - A mutable reference to a `BufWriter` wrapping the standard output. |
| 590 | +/// |
| 591 | +/// # Returns |
| 592 | +/// |
| 593 | +/// A `UResult<()>` indicating success or failure. |
| 594 | +</span><span class="kw">fn </span>process_file( |
| 595 | + file_name: <span class="kw-2">&</span>str, |
| 596 | + fmt_opts: <span class="kw-2">&</span>FmtOptions, |
| 597 | + ostream: <span class="kw-2">&mut </span>BufWriter<Stdout>, |
| 598 | +) -> UResult<()> { |
| 599 | + <span class="kw">let </span><span class="kw-2">mut </span>fp = <span class="kw">match </span>file_name { |
| 600 | + <span class="string">"-" </span>=> BufReader::new(Box::new(stdin()) <span class="kw">as </span>Box<<span class="kw">dyn </span>Read + <span class="lifetime">'static</span>>), |
| 601 | + <span class="kw">_ </span>=> <span class="kw">match </span>File::open(file_name) { |
| 602 | + <span class="prelude-val">Ok</span>(f) => BufReader::new(Box::new(f) <span class="kw">as </span>Box<<span class="kw">dyn </span>Read + <span class="lifetime">'static</span>>), |
| 603 | + <span class="prelude-val">Err</span>(e) => { |
| 604 | + <span class="macro">show_warning!</span>(<span class="string">"{}: {}"</span>, file_name.maybe_quote(), e); |
| 605 | + <span class="kw">return </span><span class="prelude-val">Ok</span>(()); |
| 606 | + } |
| 607 | + }, |
| 608 | + }; |
| 609 | + |
| 610 | + <span class="kw">let </span>p_stream = ParagraphStream::new(fmt_opts, <span class="kw-2">&mut </span>fp); |
| 611 | + <span class="kw">for </span>para_result <span class="kw">in </span>p_stream { |
| 612 | + <span class="kw">match </span>para_result { |
| 613 | + <span class="prelude-val">Err</span>(s) => { |
| 614 | + ostream |
| 615 | + .write_all(s.as_bytes()) |
| 616 | + .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>; |
| 617 | + ostream |
| 618 | + .write_all(<span class="string">b"\n"</span>) |
| 619 | + .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>; |
565 | 620 | }
|
| 621 | + <span class="prelude-val">Ok</span>(para) => break_lines(<span class="kw-2">&</span>para, fmt_opts, ostream) |
| 622 | + .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>, |
566 | 623 | }
|
| 624 | + } |
| 625 | + |
| 626 | + <span class="comment">// flush the output after each file |
| 627 | + </span>ostream |
| 628 | + .flush() |
| 629 | + .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>; |
| 630 | + |
| 631 | + <span class="prelude-val">Ok</span>(()) |
| 632 | +} |
| 633 | + |
| 634 | +<span class="attr">#[uucore::main] |
| 635 | +</span><span class="kw">pub fn </span>uumain(args: <span class="kw">impl </span>uucore::Args) -> UResult<()> { |
| 636 | + <span class="kw">let </span>(files, fmt_opts) = parse_arguments(args)<span class="question-mark">?</span>; |
| 637 | + |
| 638 | + <span class="kw">let </span><span class="kw-2">mut </span>ostream = BufWriter::new(stdout()); |
567 | 639 |
|
568 |
| - <span class="comment">// flush the output after each file |
569 |
| - </span>ostream |
570 |
| - .flush() |
571 |
| - .map_err_context(|| <span class="string">"failed to write output"</span>.to_string())<span class="question-mark">?</span>; |
| 640 | + <span class="kw">for </span>file_name <span class="kw">in </span><span class="kw-2">&</span>files { |
| 641 | + process_file(file_name, <span class="kw-2">&</span>fmt_opts, <span class="kw-2">&mut </span>ostream)<span class="question-mark">?</span>; |
572 | 642 | }
|
573 | 643 |
|
574 | 644 | <span class="prelude-val">Ok</span>(())
|
|
0 commit comments