pr: move options into mod

This commit is contained in:
Terts Diepraam 2021-05-29 14:42:24 +02:00
parent 0487360507
commit d94ee87d15

View file

@ -12,7 +12,7 @@ extern crate quick_error;
use chrono::offset::Local; use chrono::offset::Local;
use chrono::DateTime; use chrono::DateTime;
use getopts::{HasArg, Occur}; use getopts::{HasArg, Occur};
use getopts::{Matches, Options}; use getopts::Matches;
use itertools::structs::KMergeBy; use itertools::structs::KMergeBy;
use itertools::{GroupBy, Itertools}; use itertools::{GroupBy, Itertools};
use quick_error::ResultExt; use quick_error::ResultExt;
@ -35,25 +35,6 @@ static LINES_PER_PAGE: usize = 66;
static LINES_PER_PAGE_FOR_FORM_FEED: usize = 63; static LINES_PER_PAGE_FOR_FORM_FEED: usize = 63;
static HEADER_LINES_PER_PAGE: usize = 5; static HEADER_LINES_PER_PAGE: usize = 5;
static TRAILER_LINES_PER_PAGE: usize = 5; static TRAILER_LINES_PER_PAGE: usize = 5;
static STRING_HEADER_OPTION: &str = "h";
static DOUBLE_SPACE_OPTION: &str = "d";
static NUMBERING_MODE_OPTION: &str = "n";
static FIRST_LINE_NUMBER_OPTION: &str = "N";
static PAGE_RANGE_OPTION: &str = "pages";
static NO_HEADER_TRAILER_OPTION: &str = "t";
static PAGE_LENGTH_OPTION: &str = "l";
static SUPPRESS_PRINTING_ERROR: &str = "r";
static FORM_FEED_OPTION: &str = "F";
static FORM_FEED_OPTION_SMALL: &str = "f";
static COLUMN_WIDTH_OPTION: &str = "w";
static PAGE_WIDTH_OPTION: &str = "W";
static ACROSS_OPTION: &str = "a";
static COLUMN_OPTION: &str = "column";
static COLUMN_CHAR_SEPARATOR_OPTION: &str = "s";
static COLUMN_STRING_SEPARATOR_OPTION: &str = "S";
static MERGE_FILES_PRINT: &str = "m";
static OFFSET_SPACES_OPTION: &str = "o";
static JOIN_LINES_OPTION: &str = "J";
static FILE_STDIN: &str = "-"; static FILE_STDIN: &str = "-";
static READ_BUFFER_SIZE: usize = 1024 * 64; static READ_BUFFER_SIZE: usize = 1024 * 64;
static DEFAULT_COLUMN_WIDTH: usize = 72; static DEFAULT_COLUMN_WIDTH: usize = 72;
@ -61,6 +42,28 @@ static DEFAULT_COLUMN_WIDTH_WITH_S_OPTION: usize = 512;
static DEFAULT_COLUMN_SEPARATOR: &char = &TAB; static DEFAULT_COLUMN_SEPARATOR: &char = &TAB;
static FF: u8 = 0x0C as u8; static FF: u8 = 0x0C as u8;
mod options {
pub static STRING_HEADER_OPTION: &str = "h";
pub static DOUBLE_SPACE_OPTION: &str = "d";
pub static NUMBERING_MODE_OPTION: &str = "n";
pub static FIRST_LINE_NUMBER_OPTION: &str = "N";
pub static PAGE_RANGE_OPTION: &str = "pages";
pub static NO_HEADER_TRAILER_OPTION: &str = "t";
pub static PAGE_LENGTH_OPTION: &str = "l";
pub static SUPPRESS_PRINTING_ERROR: &str = "r";
pub static FORM_FEED_OPTION: &str = "F";
pub static FORM_FEED_OPTION_SMALL: &str = "f";
pub static COLUMN_WIDTH_OPTION: &str = "w";
pub static PAGE_WIDTH_OPTION: &str = "W";
pub static ACROSS_OPTION: &str = "a";
pub static COLUMN_OPTION: &str = "column";
pub static COLUMN_CHAR_SEPARATOR_OPTION: &str = "s";
pub static COLUMN_STRING_SEPARATOR_OPTION: &str = "S";
pub static MERGE_FILES_PRINT: &str = "m";
pub static OFFSET_SPACES_OPTION: &str = "o";
pub static JOIN_LINES_OPTION: &str = "J";
}
struct OutputOptions { struct OutputOptions {
/// Line numbering mode /// Line numbering mode
number: Option<NumberingMode>, number: Option<NumberingMode>,
@ -184,7 +187,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
opts.opt( opts.opt(
"", "",
PAGE_RANGE_OPTION, options::PAGE_RANGE_OPTION,
"Begin and stop printing with page FIRST_PAGE[:LAST_PAGE]", "Begin and stop printing with page FIRST_PAGE[:LAST_PAGE]",
"FIRST_PAGE[:LAST_PAGE]", "FIRST_PAGE[:LAST_PAGE]",
HasArg::Yes, HasArg::Yes,
@ -192,7 +195,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
STRING_HEADER_OPTION, options::STRING_HEADER_OPTION,
"header", "header",
"Use the string header to replace the file name \ "Use the string header to replace the file name \
in the header line.", in the header line.",
@ -202,7 +205,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
DOUBLE_SPACE_OPTION, options::DOUBLE_SPACE_OPTION,
"double-space", "double-space",
"Produce output that is double spaced. An extra <newline> character is output following every <newline> "Produce output that is double spaced. An extra <newline> character is output following every <newline>
found in the input.", found in the input.",
@ -212,7 +215,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
NUMBERING_MODE_OPTION, options::NUMBERING_MODE_OPTION,
"number-lines", "number-lines",
"Provide width digit line numbering. The default for width, if not specified, is 5. The number occupies "Provide width digit line numbering. The default for width, if not specified, is 5. The number occupies
the first width column positions of each text column or each line of -m output. If char (any nondigit the first width column positions of each text column or each line of -m output. If char (any nondigit
@ -224,7 +227,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
FIRST_LINE_NUMBER_OPTION, options::FIRST_LINE_NUMBER_OPTION,
"first-line-number", "first-line-number",
"start counting with NUMBER at 1st line of first page printed", "start counting with NUMBER at 1st line of first page printed",
"NUMBER", "NUMBER",
@ -233,7 +236,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
NO_HEADER_TRAILER_OPTION, options::NO_HEADER_TRAILER_OPTION,
"omit-header", "omit-header",
"Write neither the five-line identifying header nor the five-line trailer usually supplied for each page. Quit "Write neither the five-line identifying header nor the five-line trailer usually supplied for each page. Quit
writing after the last line of each file without spacing to the end of the page.", writing after the last line of each file without spacing to the end of the page.",
@ -243,7 +246,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
PAGE_LENGTH_OPTION, options::PAGE_LENGTH_OPTION,
"length", "length",
"Override the 66-line default (default number of lines of text 56, and with -F 63) and reset the page length to lines. If lines is not greater than the sum of both "Override the 66-line default (default number of lines of text 56, and with -F 63) and reset the page length to lines. If lines is not greater than the sum of both
the header and trailer depths (in lines), the pr utility shall suppress both the header and trailer, as if the the header and trailer depths (in lines), the pr utility shall suppress both the header and trailer, as if the
@ -254,7 +257,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
SUPPRESS_PRINTING_ERROR, options::SUPPRESS_PRINTING_ERROR,
"no-file-warnings", "no-file-warnings",
"omit warning when a file cannot be opened", "omit warning when a file cannot be opened",
"", "",
@ -263,7 +266,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
FORM_FEED_OPTION, options::FORM_FEED_OPTION,
"form-feed", "form-feed",
"Use a <form-feed> for new pages, instead of the default behavior that uses a sequence of <newline>s.", "Use a <form-feed> for new pages, instead of the default behavior that uses a sequence of <newline>s.",
"", "",
@ -271,7 +274,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
Occur::Optional, Occur::Optional,
); );
opts.opt( opts.opt(
FORM_FEED_OPTION_SMALL, options::FORM_FEED_OPTION_SMALL,
"form-feed", "form-feed",
"Same as -F but pause before beginning the first page if standard output is a "Same as -F but pause before beginning the first page if standard output is a
terminal.", terminal.",
@ -282,7 +285,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
opts.opt( opts.opt(
"", "",
COLUMN_OPTION, options::COLUMN_OPTION,
"Produce multi-column output that is arranged in column columns (the default shall be 1) and is written down each "Produce multi-column output that is arranged in column columns (the default shall be 1) and is written down each
column in the order in which the text is received from the input file. This option should not be used with -m. column in the order in which the text is received from the input file. This option should not be used with -m.
The options -e and -i shall be assumed for multiple text-column output. Whether or not text columns are pro The options -e and -i shall be assumed for multiple text-column output. Whether or not text columns are pro
@ -294,7 +297,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
COLUMN_WIDTH_OPTION, options::COLUMN_WIDTH_OPTION,
"width", "width",
"Set the width of the line to width column positions for multiple text-column output only. If the -w option is "Set the width of the line to width column positions for multiple text-column output only. If the -w option is
not specified and the -s option is not specified, the default width shall be 72. If the -w option is not speci not specified and the -s option is not specified, the default width shall be 72. If the -w option is not speci
@ -305,7 +308,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
PAGE_WIDTH_OPTION, options::PAGE_WIDTH_OPTION,
"page-width", "page-width",
"set page width to PAGE_WIDTH (72) characters always, "set page width to PAGE_WIDTH (72) characters always,
truncate lines, except -J option is set, no interference truncate lines, except -J option is set, no interference
@ -316,7 +319,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
ACROSS_OPTION, options::ACROSS_OPTION,
"across", "across",
"Modify the effect of the - column option so that the columns are filled across the page in a round-robin order "Modify the effect of the - column option so that the columns are filled across the page in a round-robin order
(for example, when column is 2, the first input line heads column 1, the second heads column 2, the third is the (for example, when column is 2, the first input line heads column 1, the second heads column 2, the third is the
@ -327,7 +330,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
COLUMN_CHAR_SEPARATOR_OPTION, options::COLUMN_CHAR_SEPARATOR_OPTION,
"separator", "separator",
"Separate text columns by the single character char instead of by the appropriate number of <space>s "Separate text columns by the single character char instead of by the appropriate number of <space>s
(default for char is the <tab> character).", (default for char is the <tab> character).",
@ -337,7 +340,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
COLUMN_STRING_SEPARATOR_OPTION, options::COLUMN_STRING_SEPARATOR_OPTION,
"sep-string", "sep-string",
"separate columns by STRING, "separate columns by STRING,
without -S: Default separator <TAB> with -J and <space> without -S: Default separator <TAB> with -J and <space>
@ -348,7 +351,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
MERGE_FILES_PRINT, options::MERGE_FILES_PRINT,
"merge", "merge",
"Merge files. Standard output shall be formatted so the pr utility writes one line from each file specified by a "Merge files. Standard output shall be formatted so the pr utility writes one line from each file specified by a
file operand, side by side into text columns of equal fixed widths, in terms of the number of column positions. file operand, side by side into text columns of equal fixed widths, in terms of the number of column positions.
@ -359,7 +362,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
OFFSET_SPACES_OPTION, options::OFFSET_SPACES_OPTION,
"indent", "indent",
"Each line of output shall be preceded by offset <space>s. If the -o option is not specified, the default offset "Each line of output shall be preceded by offset <space>s. If the -o option is not specified, the default offset
shall be zero. The space taken is in addition to the output line width (see the -w option below).", shall be zero. The space taken is in addition to the output line width (see the -w option below).",
@ -369,7 +372,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
); );
opts.opt( opts.opt(
JOIN_LINES_OPTION, options::JOIN_LINES_OPTION,
"join-lines", "join-lines",
"merge full lines, turns off -W line truncation, no column "merge full lines, turns off -W line truncation, no column
alignment, --sep-string[=STRING] sets separators", alignment, --sep-string[=STRING] sets separators",
@ -403,7 +406,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
return print_usage(&mut opts, &matches); return print_usage(&mut opts, &matches);
} }
let file_groups: Vec<Vec<String>> = if matches.opt_present(MERGE_FILES_PRINT) { let file_groups: Vec<Vec<String>> = if matches.opt_present(options::MERGE_FILES_PRINT) {
vec![files] vec![files]
} else { } else {
files.into_iter().map(|i| vec![i]).collect() files.into_iter().map(|i| vec![i]).collect()
@ -477,12 +480,12 @@ fn recreate_arguments(args: &Vec<String>) -> Vec<String> {
} }
fn print_error(matches: &Matches, err: PrError) { fn print_error(matches: &Matches, err: PrError) {
if !matches.opt_present(SUPPRESS_PRINTING_ERROR) { if !matches.opt_present(options::SUPPRESS_PRINTING_ERROR) {
eprintln!("{}", err); eprintln!("{}", err);
} }
} }
fn print_usage(opts: &mut Options, matches: &Matches) -> i32 { fn print_usage(opts: &mut getopts::Options, matches: &Matches) -> i32 {
println!("{} {} -- print files", NAME, VERSION); println!("{} {} -- print files", NAME, VERSION);
println!(); println!();
println!( println!(
@ -517,7 +520,7 @@ fn print_usage(opts: &mut Options, matches: &Matches) -> i32 {
println!(" +page \t\tBegin output at page number page of the formatted input."); println!(" +page \t\tBegin output at page number page of the formatted input.");
println!( println!(
" -column \t\tProduce multi-column output. Refer --{}", " -column \t\tProduce multi-column output. Refer --{}",
COLUMN_OPTION options::COLUMN_OPTION
); );
if matches.free.is_empty() { if matches.free.is_empty() {
return 1; return 1;
@ -546,30 +549,30 @@ fn build_options(
free_args: String, free_args: String,
) -> Result<OutputOptions, PrError> { ) -> Result<OutputOptions, PrError> {
let form_feed_used = let form_feed_used =
matches.opt_present(FORM_FEED_OPTION) || matches.opt_present(FORM_FEED_OPTION_SMALL); matches.opt_present(options::FORM_FEED_OPTION) || matches.opt_present(options::FORM_FEED_OPTION_SMALL);
let is_merge_mode: bool = matches.opt_present(MERGE_FILES_PRINT); let is_merge_mode: bool = matches.opt_present(options::MERGE_FILES_PRINT);
if is_merge_mode && matches.opt_present(COLUMN_OPTION) { if is_merge_mode && matches.opt_present(options::COLUMN_OPTION) {
let err_msg: String = let err_msg: String =
String::from("cannot specify number of columns when printing in parallel"); String::from("cannot specify number of columns when printing in parallel");
return Err(PrError::EncounteredErrors(err_msg)); return Err(PrError::EncounteredErrors(err_msg));
} }
if is_merge_mode && matches.opt_present(ACROSS_OPTION) { if is_merge_mode && matches.opt_present(options::ACROSS_OPTION) {
let err_msg: String = let err_msg: String =
String::from("cannot specify both printing across and printing in parallel"); String::from("cannot specify both printing across and printing in parallel");
return Err(PrError::EncounteredErrors(err_msg)); return Err(PrError::EncounteredErrors(err_msg));
} }
let merge_files_print: Option<usize> = if matches.opt_present(MERGE_FILES_PRINT) { let merge_files_print: Option<usize> = if matches.opt_present(options::MERGE_FILES_PRINT) {
Some(paths.len()) Some(paths.len())
} else { } else {
None None
}; };
let header: String = matches let header: String = matches
.opt_str(STRING_HEADER_OPTION) .opt_str(options::STRING_HEADER_OPTION)
.unwrap_or(if is_merge_mode { .unwrap_or(if is_merge_mode {
String::new() String::new()
} else { } else {
@ -582,10 +585,10 @@ fn build_options(
let default_first_number: usize = NumberingMode::default().first_number; let default_first_number: usize = NumberingMode::default().first_number;
let first_number: usize = let first_number: usize =
parse_usize(matches, FIRST_LINE_NUMBER_OPTION).unwrap_or(Ok(default_first_number))?; parse_usize(matches, options::FIRST_LINE_NUMBER_OPTION).unwrap_or(Ok(default_first_number))?;
let number: Option<NumberingMode> = matches let number: Option<NumberingMode> = matches
.opt_str(NUMBERING_MODE_OPTION) .opt_str(options::NUMBERING_MODE_OPTION)
.map(|i| { .map(|i| {
let parse_result: Result<usize, ParseIntError> = i.parse::<usize>(); let parse_result: Result<usize, ParseIntError> = i.parse::<usize>();
@ -610,14 +613,14 @@ fn build_options(
} }
}) })
.or_else(|| { .or_else(|| {
if matches.opt_present(NUMBERING_MODE_OPTION) { if matches.opt_present(options::NUMBERING_MODE_OPTION) {
return Some(NumberingMode::default()); return Some(NumberingMode::default());
} }
None None
}); });
let double_space: bool = matches.opt_present(DOUBLE_SPACE_OPTION); let double_space: bool = matches.opt_present(options::DOUBLE_SPACE_OPTION);
let content_line_separator: String = if double_space { let content_line_separator: String = if double_space {
"\n".repeat(2) "\n".repeat(2)
@ -662,14 +665,14 @@ fn build_options(
}; };
let invalid_pages_map = |i: String| { let invalid_pages_map = |i: String| {
let unparsed_value: String = matches.opt_str(PAGE_RANGE_OPTION).unwrap(); let unparsed_value: String = matches.opt_str(options::PAGE_RANGE_OPTION).unwrap();
i.parse::<usize>().map_err(|_e| { i.parse::<usize>().map_err(|_e| {
PrError::EncounteredErrors(format!("invalid --pages argument '{}'", unparsed_value)) PrError::EncounteredErrors(format!("invalid --pages argument '{}'", unparsed_value))
}) })
}; };
let start_page: usize = match matches let start_page: usize = match matches
.opt_str(PAGE_RANGE_OPTION) .opt_str(options::PAGE_RANGE_OPTION)
.map(|i| { .map(|i| {
let x: Vec<&str> = i.split(':').collect(); let x: Vec<&str> = i.split(':').collect();
x[0].to_string() x[0].to_string()
@ -681,7 +684,7 @@ fn build_options(
}; };
let end_page: Option<usize> = match matches let end_page: Option<usize> = match matches
.opt_str(PAGE_RANGE_OPTION) .opt_str(options::PAGE_RANGE_OPTION)
.filter(|i: &String| i.contains(':')) .filter(|i: &String| i.contains(':'))
.map(|i: String| { .map(|i: String| {
let x: Vec<&str> = i.split(':').collect(); let x: Vec<&str> = i.split(':').collect();
@ -708,12 +711,12 @@ fn build_options(
}; };
let page_length: usize = let page_length: usize =
parse_usize(matches, PAGE_LENGTH_OPTION).unwrap_or(Ok(default_lines_per_page))?; parse_usize(matches, options::PAGE_LENGTH_OPTION).unwrap_or(Ok(default_lines_per_page))?;
let page_length_le_ht: bool = page_length < (HEADER_LINES_PER_PAGE + TRAILER_LINES_PER_PAGE); let page_length_le_ht: bool = page_length < (HEADER_LINES_PER_PAGE + TRAILER_LINES_PER_PAGE);
let display_header_and_trailer: bool = let display_header_and_trailer: bool =
!(page_length_le_ht) && !matches.opt_present(NO_HEADER_TRAILER_OPTION); !(page_length_le_ht) && !matches.opt_present(options::NO_HEADER_TRAILER_OPTION);
let content_lines_per_page: usize = if page_length_le_ht { let content_lines_per_page: usize = if page_length_le_ht {
page_length page_length
@ -721,23 +724,23 @@ fn build_options(
page_length - (HEADER_LINES_PER_PAGE + TRAILER_LINES_PER_PAGE) page_length - (HEADER_LINES_PER_PAGE + TRAILER_LINES_PER_PAGE)
}; };
let page_separator_char: String = if matches.opt_present(FORM_FEED_OPTION) { let page_separator_char: String = if matches.opt_present(options::FORM_FEED_OPTION) {
let bytes = vec![FF]; let bytes = vec![FF];
String::from_utf8(bytes).unwrap() String::from_utf8(bytes).unwrap()
} else { } else {
"\n".to_string() "\n".to_string()
}; };
let across_mode: bool = matches.opt_present(ACROSS_OPTION); let across_mode: bool = matches.opt_present(options::ACROSS_OPTION);
let column_separator: String = match matches.opt_str(COLUMN_STRING_SEPARATOR_OPTION) { let column_separator: String = match matches.opt_str(options::COLUMN_STRING_SEPARATOR_OPTION) {
Some(x) => Some(x), Some(x) => Some(x),
None => matches.opt_str(COLUMN_CHAR_SEPARATOR_OPTION), None => matches.opt_str(options::COLUMN_CHAR_SEPARATOR_OPTION),
} }
.unwrap_or(DEFAULT_COLUMN_SEPARATOR.to_string()); .unwrap_or(DEFAULT_COLUMN_SEPARATOR.to_string());
let default_column_width = if matches.opt_present(COLUMN_WIDTH_OPTION) let default_column_width = if matches.opt_present(options::COLUMN_WIDTH_OPTION)
&& matches.opt_present(COLUMN_CHAR_SEPARATOR_OPTION) && matches.opt_present(options::COLUMN_CHAR_SEPARATOR_OPTION)
{ {
DEFAULT_COLUMN_WIDTH_WITH_S_OPTION DEFAULT_COLUMN_WIDTH_WITH_S_OPTION
} else { } else {
@ -745,12 +748,12 @@ fn build_options(
}; };
let column_width: usize = let column_width: usize =
parse_usize(matches, COLUMN_WIDTH_OPTION).unwrap_or(Ok(default_column_width))?; parse_usize(matches, options::COLUMN_WIDTH_OPTION).unwrap_or(Ok(default_column_width))?;
let page_width: Option<usize> = if matches.opt_present(JOIN_LINES_OPTION) { let page_width: Option<usize> = if matches.opt_present(options::JOIN_LINES_OPTION) {
None None
} else { } else {
match parse_usize(matches, PAGE_WIDTH_OPTION) { match parse_usize(matches, options::PAGE_WIDTH_OPTION) {
Some(res) => Some(res?), Some(res) => Some(res?),
None => None, None => None,
} }
@ -770,7 +773,7 @@ fn build_options(
// --column has more priority than -column // --column has more priority than -column
let column_option_value: Option<usize> = match parse_usize(matches, COLUMN_OPTION) { let column_option_value: Option<usize> = match parse_usize(matches, options::COLUMN_OPTION) {
Some(res) => Some(res?), Some(res) => Some(res?),
_ => start_column_option, _ => start_column_option,
}; };
@ -786,8 +789,8 @@ fn build_options(
}; };
let offset_spaces: String = let offset_spaces: String =
" ".repeat(parse_usize(matches, OFFSET_SPACES_OPTION).unwrap_or(Ok(0))?); " ".repeat(parse_usize(matches, options::OFFSET_SPACES_OPTION).unwrap_or(Ok(0))?);
let join_lines: bool = matches.opt_present(JOIN_LINES_OPTION); let join_lines: bool = matches.opt_present(options::JOIN_LINES_OPTION);
let col_sep_for_printing = column_mode_options let col_sep_for_printing = column_mode_options
.as_ref() .as_ref()