|
740 | 740 | <span id="738">738</span>
|
741 | 741 | <span id="739">739</span>
|
742 | 742 | <span id="740">740</span>
|
| 743 | +<span id="741">741</span> |
| 744 | +<span id="742">742</span> |
| 745 | +<span id="743">743</span> |
| 746 | +<span id="744">744</span> |
| 747 | +<span id="745">745</span> |
| 748 | +<span id="746">746</span> |
| 749 | +<span id="747">747</span> |
| 750 | +<span id="748">748</span> |
| 751 | +<span id="749">749</span> |
| 752 | +<span id="750">750</span> |
| 753 | +<span id="751">751</span> |
| 754 | +<span id="752">752</span> |
| 755 | +<span id="753">753</span> |
| 756 | +<span id="754">754</span> |
| 757 | +<span id="755">755</span> |
| 758 | +<span id="756">756</span> |
| 759 | +<span id="757">757</span> |
743 | 760 | </pre><pre class="rust"><code><span class="comment">// This file is part of the uutils coreutils package.</span>
|
744 | 761 | <span class="comment">//</span>
|
745 | 762 | <span class="comment">// (c) Fangxu Hu <framlog@gmail.com></span>
|
|
853 | 870 |
|
854 | 871 | <span class="doccomment">/// An error getting the columns to display in the output table.</span>
|
855 | 872 | <span class="ident">ColumnError</span>(<span class="ident">ColumnError</span>),
|
| 873 | + |
| 874 | + <span class="ident">FilesystemTypeBothSelectedAndExcluded</span>(<span class="ident">Vec</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>), |
856 | 875 | }
|
857 | 876 |
|
858 | 877 | <span class="kw">impl</span> <span class="ident">fmt::Display</span> <span class="kw">for</span> <span class="ident">OptionsError</span> {
|
|
868 | 887 | <span class="string">"option --output: field {} used more than once"</span>,
|
869 | 888 | <span class="ident">s</span>.<span class="ident">quote</span>()
|
870 | 889 | ),
|
| 890 | + <span class="ident"><span class="self">Self</span>::FilesystemTypeBothSelectedAndExcluded</span>(<span class="ident">types</span>) => { |
| 891 | + <span class="kw">for</span> <span class="ident">t</span> <span class="kw">in</span> <span class="ident">types</span> { |
| 892 | + <span class="macro">eprintln!</span>( |
| 893 | + <span class="string">"{}: file system type {} both selected and excluded"</span>, |
| 894 | + <span class="ident">uucore::util_name</span>(), |
| 895 | + <span class="ident">t</span>.<span class="ident">quote</span>() |
| 896 | + ); |
| 897 | + } |
| 898 | + <span class="prelude-val">Ok</span>(()) |
| 899 | + } |
871 | 900 | }
|
872 | 901 | }
|
873 | 902 | }
|
874 | 903 |
|
875 | 904 | <span class="kw">impl</span> <span class="ident">Options</span> {
|
876 | 905 | <span class="doccomment">/// Convert command-line arguments into [`Options`].</span>
|
877 | 906 | <span class="kw">fn</span> <span class="ident">from</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="self">Self</span>, <span class="ident">OptionsError</span><span class="op">></span> {
|
| 907 | + <span class="kw">let</span> <span class="ident">include</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">values_of_lossy</span>(<span class="ident">OPT_TYPE</span>); |
| 908 | + <span class="kw">let</span> <span class="ident">exclude</span> <span class="op">=</span> <span class="ident">matches</span>.<span class="ident">values_of_lossy</span>(<span class="ident">OPT_EXCLUDE_TYPE</span>); |
| 909 | + |
| 910 | + <span class="kw">if</span> <span class="kw">let</span> (<span class="prelude-val">Some</span>(<span class="ident">include</span>), <span class="prelude-val">Some</span>(<span class="ident">exclude</span>)) <span class="op">=</span> (<span class="kw-2">&</span><span class="ident">include</span>, <span class="kw-2">&</span><span class="ident">exclude</span>) { |
| 911 | + <span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">types</span>) <span class="op">=</span> <span class="ident"><span class="self">Self</span>::get_intersected_types</span>(<span class="ident">include</span>, <span class="ident">exclude</span>) { |
| 912 | + <span class="kw">return</span> <span class="prelude-val">Err</span>(<span class="ident">OptionsError::FilesystemTypeBothSelectedAndExcluded</span>(<span class="ident">types</span>)); |
| 913 | + } |
| 914 | + } |
| 915 | + |
878 | 916 | <span class="prelude-val">Ok</span>(<span class="self">Self</span> {
|
879 | 917 | <span class="ident">show_local_fs</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_LOCAL</span>),
|
880 | 918 | <span class="ident">show_all_fs</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_ALL</span>),
|
881 | 919 | <span class="ident">show_listed_fs</span>: <span class="bool-val">false</span>,
|
882 | 920 | <span class="ident">block_size</span>: <span class="ident">block_size_from_matches</span>(<span class="ident">matches</span>)
|
883 | 921 | .<span class="ident">map_err</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">OptionsError::InvalidBlockSize</span>)<span class="question-mark">?</span>,
|
884 |
| - <span class="ident">include</span>: <span class="ident">matches</span>.<span class="ident">values_of_lossy</span>(<span class="ident">OPT_TYPE</span>), |
885 |
| - <span class="ident">exclude</span>: <span class="ident">matches</span>.<span class="ident">values_of_lossy</span>(<span class="ident">OPT_EXCLUDE_TYPE</span>), |
| 922 | + <span class="ident">include</span>, |
| 923 | + <span class="ident">exclude</span>, |
886 | 924 | <span class="ident">show_total</span>: <span class="ident">matches</span>.<span class="ident">is_present</span>(<span class="ident">OPT_TOTAL</span>),
|
887 | 925 | <span class="ident">columns</span>: <span class="ident">Column::from_matches</span>(<span class="ident">matches</span>).<span class="ident">map_err</span>(<span class="ident">OptionsError::ColumnError</span>)<span class="question-mark">?</span>,
|
888 | 926 | })
|
889 | 927 | }
|
| 928 | + |
| 929 | + <span class="kw">fn</span> <span class="ident">get_intersected_types</span>(<span class="ident">include</span>: <span class="kw-2">&</span>[<span class="ident">String</span>], <span class="ident">exclude</span>: <span class="kw-2">&</span>[<span class="ident">String</span>]) -> <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">String</span><span class="op">></span><span class="op">></span> { |
| 930 | + <span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">intersected_types</span> <span class="op">=</span> <span class="ident">Vec::new</span>(); |
| 931 | + |
| 932 | + <span class="kw">for</span> <span class="ident">t</span> <span class="kw">in</span> <span class="ident">include</span> { |
| 933 | + <span class="kw">if</span> <span class="ident">exclude</span>.<span class="ident">contains</span>(<span class="ident">t</span>) { |
| 934 | + <span class="ident">intersected_types</span>.<span class="ident">push</span>(<span class="ident">t</span>.<span class="ident">clone</span>()); |
| 935 | + } |
| 936 | + } |
| 937 | + |
| 938 | + (<span class="op">!</span><span class="ident">intersected_types</span>.<span class="ident">is_empty</span>()).<span class="ident">then</span>(<span class="op">|</span><span class="op">|</span> <span class="ident">intersected_types</span>) |
| 939 | + } |
890 | 940 | }
|
891 | 941 |
|
892 | 942 | <span class="doccomment">/// Whether to display the mount info given the inclusion settings.</span>
|
|
1450 | 1500 | <span class="kw">let</span> <span class="ident">m</span> <span class="op">=</span> <span class="ident">mount_info</span>(<span class="string">"ext4"</span>, <span class="string">"/mnt/foo"</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>);
|
1451 | 1501 | <span class="macro">assert!</span>(<span class="ident">is_included</span>(<span class="kw-2">&</span><span class="ident">m</span>, <span class="kw-2">&</span><span class="ident">opt</span>));
|
1452 | 1502 | }
|
1453 |
| - |
1454 |
| - <span class="attribute">#[<span class="ident">test</span>]</span> |
1455 |
| - <span class="kw">fn</span> <span class="ident">test_include_and_exclude_match_both</span>() { |
1456 |
| - <span class="comment">// TODO The same filesystem type in both `include` and</span> |
1457 |
| - <span class="comment">// `exclude` should cause an error, but currently does</span> |
1458 |
| - <span class="comment">// not.</span> |
1459 |
| - <span class="kw">let</span> <span class="ident">include</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="macro">vec!</span>[<span class="ident">String::from</span>(<span class="string">"ext4"</span>)]); |
1460 |
| - <span class="kw">let</span> <span class="ident">exclude</span> <span class="op">=</span> <span class="prelude-val">Some</span>(<span class="macro">vec!</span>[<span class="ident">String::from</span>(<span class="string">"ext4"</span>)]); |
1461 |
| - <span class="kw">let</span> <span class="ident">opt</span> <span class="op">=</span> <span class="ident">Options</span> { |
1462 |
| - <span class="ident">include</span>, |
1463 |
| - <span class="ident">exclude</span>, |
1464 |
| - ..<span class="ident">Default::default</span>() |
1465 |
| - }; |
1466 |
| - <span class="kw">let</span> <span class="ident">m</span> <span class="op">=</span> <span class="ident">mount_info</span>(<span class="string">"ext4"</span>, <span class="string">"/mnt/foo"</span>, <span class="bool-val">false</span>, <span class="bool-val">false</span>); |
1467 |
| - <span class="macro">assert!</span>(<span class="op">!</span><span class="ident">is_included</span>(<span class="kw-2">&</span><span class="ident">m</span>, <span class="kw-2">&</span><span class="ident">opt</span>)); |
1468 |
| - } |
1469 | 1503 | }
|
1470 | 1504 |
|
1471 | 1505 | <span class="kw">mod</span> <span class="ident">filter_mount_list</span> {
|
|
0 commit comments