From 564cf64b1b9c7616d4d5857093d64aca9db4e53c Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Tue, 18 Apr 2023 19:01:18 +0800 Subject: [PATCH 01/12] Support both little and big endian dump --- src/bin/hexyl.rs | 11 ++++++++ src/lib.rs | 37 ++++++++++++++++++++++++- tests/integration_tests.rs | 56 +++++++++++++++++++++++++++++++++++--- 3 files changed, 99 insertions(+), 5 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index 872df04..32986a4 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -203,6 +203,15 @@ fn run() -> Result<()> { width but still leave some space to the right.\nCannot be used with other \ width-setting options.", ), + ) + .arg( + Arg::new("little_endian_dump") + .short('e') + .action(ArgAction::SetTrue) + .help( + "Print out the data in little endian format. Otherwise the data will be showed \ + in big endian format by default.", + ), ); let matches = command.get_matches(); @@ -425,6 +434,7 @@ fn run() -> Result<()> { ) }; + let little_endian_dump = *matches.get_one::("little_endian_dump").unwrap_or(&false); let stdout = io::stdout(); let mut stdout_lock = BufWriter::new(stdout.lock()); @@ -437,6 +447,7 @@ fn run() -> Result<()> { .num_panels(panels) .group_size(group_size) .with_base(base) + .little_endian_dump(little_endian_dump) .build(); printer.display_offset(skip_offset + display_offset); printer.print_all(&mut reader).map_err(|e| anyhow!(e))?; diff --git a/src/lib.rs b/src/lib.rs index 62d01ce..dcb10bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -159,6 +159,7 @@ pub struct PrinterBuilder<'a, Writer: Write> { panels: u64, group_size: u8, base: Base, + little_endian_dump: bool, } impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { @@ -173,6 +174,7 @@ impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { panels: 2, group_size: 1, base: Base::Hexadecimal, + little_endian_dump: false, } } @@ -216,6 +218,11 @@ impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { self } + pub fn little_endian_dump(mut self, little_endian_dump: bool) -> Self { + self.little_endian_dump = little_endian_dump; + self + } + pub fn build(self) -> Printer<'a, Writer> { Printer::new( self.writer, @@ -227,6 +234,7 @@ impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { self.panels, self.group_size, self.base, + self.little_endian_dump, ) } } @@ -254,6 +262,8 @@ pub struct Printer<'a, Writer: Write> { group_size: u8, /// The number of digits used to write the base. base_digits: u8, + /// Whether to print the bytes in little endian + little_endian_dump: bool, } impl<'a, Writer: Write> Printer<'a, Writer> { @@ -267,6 +277,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { panels: u64, group_size: u8, base: Base, + little_endian_dump: bool, ) -> Printer<'a, Writer> { Printer { idx: 0, @@ -304,6 +315,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { Base::Decimal => 3, Base::Hexadecimal => 2, }, + little_endian_dump, } } @@ -523,8 +535,27 @@ impl<'a, Writer: Write> Printer<'a, Writer> { Ok(()) } + fn reorder_buf_to_le(&self, buf: &mut Vec) { + let n = buf.len(); + let group_sz = self.group_size as usize; + + for idx in (0..n).step_by(group_sz) { + let remaining = n - idx; + let total = remaining.min(group_sz); + + buf[idx..idx+total].reverse(); + } + } + pub fn print_bytes(&mut self) -> io::Result<()> { - for (i, &b) in self.line_buf.clone().iter().enumerate() { + let mut buf = self.line_buf.clone(); + + if self.little_endian_dump { + // reorder the buffer to the little endian format + self.reorder_buf_to_le(&mut buf); + }; + + for (i, &b) in buf.iter().enumerate() { self.print_byte(i, b)?; } Ok(()) @@ -682,6 +713,7 @@ mod tests { 2, 1, Base::Hexadecimal, + false, ); printer.print_all(input).unwrap(); @@ -736,6 +768,7 @@ mod tests { 2, 1, Base::Hexadecimal, + false, ); printer.display_offset(0xdeadbeef); @@ -769,6 +802,7 @@ mod tests { 4, 1, Base::Hexadecimal, + false, ); printer.print_all(input).unwrap(); @@ -828,6 +862,7 @@ mod tests { 3, 1, Base::Hexadecimal, + false, ); printer.print_all(input).unwrap(); diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index fda9daf..b8a95c9 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -292,12 +292,12 @@ mod display_settings { } } -mod group { +mod group_and_endian { use super::hexyl; use super::PrettyAssert; #[test] - fn group_2_bytes() { + fn group_2_bytes_be() { hexyl() .arg("ascii") .arg("--color=never") @@ -312,7 +312,23 @@ mod group { } #[test] - fn group_4_bytes() { + fn group_2_bytes_le() { + hexyl() + .arg("ascii") + .arg("--color=never") + .arg("--group-size=2") + .arg("-e") + .assert() + .success() + .stdout( + "┌────────┬─────────────────────┬─────────────────────┬────────┬────────┐\n\ + │00000000│ 3130 3332 3534 3736 ┊ 3938 6261 6463 0a65 │01234567┊89abcde_│\n\ + └────────┴─────────────────────┴─────────────────────┴────────┴────────┘\n", + ); + } + + #[test] + fn group_4_bytes_be() { hexyl() .arg("ascii") .arg("--color=never") @@ -327,7 +343,23 @@ mod group { } #[test] - fn group_8_bytes() { + fn group_4_bytes_le() { + hexyl() + .arg("ascii") + .arg("--color=never") + .arg("--group-size=4") + .arg("-e") + .assert() + .success() + .stdout( + "┌────────┬───────────────────┬───────────────────┬────────┬────────┐\n\ + │00000000│ 33323130 37363534 ┊ 62613938 0a656463 │01234567┊89abcde_│\n\ + └────────┴───────────────────┴───────────────────┴────────┴────────┘\n", + ); + } + + #[test] + fn group_8_bytes_be() { hexyl() .arg("ascii") .arg("--color=never") @@ -341,6 +373,22 @@ mod group { ); } + #[test] + fn group_8_bytes_le() { + hexyl() + .arg("ascii") + .arg("--color=never") + .arg("--group-size=8") + .arg("-e") + .assert() + .success() + .stdout( + "┌────────┬──────────────────┬──────────────────┬────────┬────────┐\n\ + │00000000│ 3736353433323130 ┊ 0a65646362613938 │01234567┊89abcde_│\n\ + └────────┴──────────────────┴──────────────────┴────────┴────────┘\n", + ); + } + #[test] fn group_size_plain() { hexyl() From dd601e479298d7e148966e671ae38b1a1b70f911 Mon Sep 17 00:00:00 2001 From: David Peter Date: Fri, 21 Apr 2023 21:28:52 +0200 Subject: [PATCH 02/12] Run cargo fmt --- src/bin/hexyl.rs | 4 +++- src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index 32986a4..5334be0 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -434,7 +434,9 @@ fn run() -> Result<()> { ) }; - let little_endian_dump = *matches.get_one::("little_endian_dump").unwrap_or(&false); + let little_endian_dump = *matches + .get_one::("little_endian_dump") + .unwrap_or(&false); let stdout = io::stdout(); let mut stdout_lock = BufWriter::new(stdout.lock()); diff --git a/src/lib.rs b/src/lib.rs index dcb10bf..724d83e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -543,7 +543,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { let remaining = n - idx; let total = remaining.min(group_sz); - buf[idx..idx+total].reverse(); + buf[idx..idx + total].reverse(); } } From 08b903270fd74553919d3d7765d04548236c2bf5 Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Sat, 22 Apr 2023 12:56:28 +0800 Subject: [PATCH 03/12] Change endianness from boolean type to enum --- src/bin/hexyl.rs | 12 ++++++++---- src/lib.rs | 23 ++++++++++++++--------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index 5334be0..35e82f2 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -17,7 +17,7 @@ use thiserror::Error as ThisError; use terminal_size::terminal_size; -use hexyl::{Base, BorderStyle, Input, PrinterBuilder}; +use hexyl::{Base, BorderStyle, Endianness, Input, PrinterBuilder}; const DEFAULT_BLOCK_SIZE: i64 = 512; @@ -434,9 +434,13 @@ fn run() -> Result<()> { ) }; - let little_endian_dump = *matches + let endianness = match *matches .get_one::("little_endian_dump") - .unwrap_or(&false); + .unwrap_or(&false) + { + true => Endianness::Little, + false => Endianness::Big, + }; let stdout = io::stdout(); let mut stdout_lock = BufWriter::new(stdout.lock()); @@ -449,7 +453,7 @@ fn run() -> Result<()> { .num_panels(panels) .group_size(group_size) .with_base(base) - .little_endian_dump(little_endian_dump) + .endianness(endianness) .build(); printer.display_offset(skip_offset + display_offset); printer.print_all(&mut reader).map_err(|e| anyhow!(e))?; diff --git a/src/lib.rs b/src/lib.rs index 724d83e..98c694f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,6 +29,11 @@ pub enum ByteCategory { NonAscii, } +pub enum Endianness { + Little, + Big, +} + #[derive(PartialEq)] enum Squeezer { Print, @@ -159,7 +164,7 @@ pub struct PrinterBuilder<'a, Writer: Write> { panels: u64, group_size: u8, base: Base, - little_endian_dump: bool, + endianness: Endianness, } impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { @@ -174,7 +179,7 @@ impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { panels: 2, group_size: 1, base: Base::Hexadecimal, - little_endian_dump: false, + endianness: Endianness::Big, } } @@ -218,8 +223,8 @@ impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { self } - pub fn little_endian_dump(mut self, little_endian_dump: bool) -> Self { - self.little_endian_dump = little_endian_dump; + pub fn endianness(mut self, endianness: Endianness) -> Self { + self.endianness = endianness; self } @@ -234,7 +239,7 @@ impl<'a, Writer: Write> PrinterBuilder<'a, Writer> { self.panels, self.group_size, self.base, - self.little_endian_dump, + self.endianness, ) } } @@ -263,7 +268,7 @@ pub struct Printer<'a, Writer: Write> { /// The number of digits used to write the base. base_digits: u8, /// Whether to print the bytes in little endian - little_endian_dump: bool, + endianness: Endianness, } impl<'a, Writer: Write> Printer<'a, Writer> { @@ -277,7 +282,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { panels: u64, group_size: u8, base: Base, - little_endian_dump: bool, + endianness: Endianness, ) -> Printer<'a, Writer> { Printer { idx: 0, @@ -315,7 +320,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { Base::Decimal => 3, Base::Hexadecimal => 2, }, - little_endian_dump, + endianness, } } @@ -550,7 +555,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { pub fn print_bytes(&mut self) -> io::Result<()> { let mut buf = self.line_buf.clone(); - if self.little_endian_dump { + if matches!(self.endianness, Endianness::Little) { // reorder the buffer to the little endian format self.reorder_buf_to_le(&mut buf); }; From a966896d3f3186ea4ad9a101c0e10f46d6281fd8 Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Sat, 22 Apr 2023 13:06:17 +0800 Subject: [PATCH 04/12] Fix integration test module name --- tests/integration_tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index b8a95c9..297cce1 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -292,7 +292,7 @@ mod display_settings { } } -mod group_and_endian { +mod group_and_endianness { use super::hexyl; use super::PrettyAssert; From 43f8b92502164de61519e1ee505000fdea965027 Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Sat, 22 Apr 2023 13:14:35 +0800 Subject: [PATCH 05/12] Fix test for endianness --- src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 98c694f..1d74475 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -718,7 +718,7 @@ mod tests { 2, 1, Base::Hexadecimal, - false, + Endianness::Big, ); printer.print_all(input).unwrap(); @@ -773,7 +773,7 @@ mod tests { 2, 1, Base::Hexadecimal, - false, + Endianness::Big, ); printer.display_offset(0xdeadbeef); @@ -807,7 +807,7 @@ mod tests { 4, 1, Base::Hexadecimal, - false, + Endianness::Big, ); printer.print_all(input).unwrap(); @@ -867,7 +867,7 @@ mod tests { 3, 1, Base::Hexadecimal, - false, + Endianness::Big, ); printer.print_all(input).unwrap(); From d703cdfd7834e0d6ed1f90c957c03c555ea11efa Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Mon, 24 Apr 2023 23:10:25 +0800 Subject: [PATCH 06/12] Fix comment error and grammarly --- src/bin/hexyl.rs | 2 +- src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index 35e82f2..f48879e 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -209,7 +209,7 @@ fn run() -> Result<()> { .short('e') .action(ArgAction::SetTrue) .help( - "Print out the data in little endian format. Otherwise the data will be showed \ + "Print out the data in little endian format. Otherwise the data will be shown \ in big endian format by default.", ), ); diff --git a/src/lib.rs b/src/lib.rs index 1d74475..c9b6f99 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -267,7 +267,7 @@ pub struct Printer<'a, Writer: Write> { group_size: u8, /// The number of digits used to write the base. base_digits: u8, - /// Whether to print the bytes in little endian + /// Whether to show groups in little or big endian ordering. endianness: Endianness, } From 58b038af2752a795aeabd489208ad5974ef7c2d7 Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Mon, 24 Apr 2023 23:13:28 +0800 Subject: [PATCH 07/12] Change le to non-abbreviated name little endian --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index c9b6f99..4aaf65a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -540,7 +540,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { Ok(()) } - fn reorder_buf_to_le(&self, buf: &mut Vec) { + fn reorder_buf_to_little_endian(&self, buf: &mut Vec) { let n = buf.len(); let group_sz = self.group_size as usize; From b251575d94b74cd789a0f9ae4eb3f5eaae605e3e Mon Sep 17 00:00:00 2001 From: RinHizakura Date: Mon, 24 Apr 2023 23:44:49 +0800 Subject: [PATCH 08/12] Change design for endianness command line option --- src/bin/hexyl.rs | 23 ++++++++++++----------- src/lib.rs | 2 +- tests/integration_tests.rs | 6 +++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index f48879e..99554cb 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -205,12 +205,15 @@ fn run() -> Result<()> { ), ) .arg( - Arg::new("little_endian_dump") - .short('e') - .action(ArgAction::SetTrue) + Arg::new("endianness") + .long("endianness") + .requires("group_size") + .num_args(1) + .value_name("ENDIANNESS") + .value_parser(["big", "little"]) + .default_value("big") .help( - "Print out the data in little endian format. Otherwise the data will be shown \ - in big endian format by default.", + "Whether to print out the data in little endian format or big endian format.", ), ); @@ -434,12 +437,10 @@ fn run() -> Result<()> { ) }; - let endianness = match *matches - .get_one::("little_endian_dump") - .unwrap_or(&false) - { - true => Endianness::Little, - false => Endianness::Big, + let endianness = match matches.get_one::("endianness").map(String::as_ref) { + Some("little") => Endianness::Little, + Some("big") => Endianness::Big, + _ => unreachable!(), }; let stdout = io::stdout(); let mut stdout_lock = BufWriter::new(stdout.lock()); diff --git a/src/lib.rs b/src/lib.rs index 4aaf65a..6ee6ec6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -557,7 +557,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { if matches!(self.endianness, Endianness::Little) { // reorder the buffer to the little endian format - self.reorder_buf_to_le(&mut buf); + self.reorder_buf_to_little_endian(&mut buf); }; for (i, &b) in buf.iter().enumerate() { diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 297cce1..fc10dfa 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -317,7 +317,7 @@ mod group_and_endianness { .arg("ascii") .arg("--color=never") .arg("--group-size=2") - .arg("-e") + .arg("--endianness=little") .assert() .success() .stdout( @@ -348,7 +348,7 @@ mod group_and_endianness { .arg("ascii") .arg("--color=never") .arg("--group-size=4") - .arg("-e") + .arg("--endianness=little") .assert() .success() .stdout( @@ -379,7 +379,7 @@ mod group_and_endianness { .arg("ascii") .arg("--color=never") .arg("--group-size=8") - .arg("-e") + .arg("--endianness=little") .assert() .success() .stdout( From 20450310c9a3bb75ab2725fe04ea49dfcd9395fb Mon Sep 17 00:00:00 2001 From: David Peter Date: Tue, 25 Apr 2023 08:48:39 +0200 Subject: [PATCH 09/12] Help text adjustments, do not require group-size to be present --- src/bin/hexyl.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index 99554cb..cc7fe8f 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -174,8 +174,23 @@ fn run() -> Result<()> { .value_name("N") .help( "Number of bytes/octets that should be grouped together. \ - Possible group sizes are 1, 2, 4, 8. The default is 1. \ - '--groupsize can be used as an alias (xxd-compatibility).", + Possible group sizes are 1, 2, 4, 8. The default is 1. You \ + can use the '--endianness' option to control the ordering of \ + the bytes within a group. '--groupsize' can be used as an \ + alias (xxd-compatibility).", + ), + ) + .arg( + Arg::new("endianness") + .long("endianness") + .num_args(1) + .value_name("FORMAT") + .value_parser(["big", "little"]) + .default_value("big") + .help( + "Whether to print out groups in little-endian or big-endian \ + format. This option only has an effect if the '--group-size' \ + is larger than 1.", ), ) .arg( @@ -203,18 +218,6 @@ fn run() -> Result<()> { width but still leave some space to the right.\nCannot be used with other \ width-setting options.", ), - ) - .arg( - Arg::new("endianness") - .long("endianness") - .requires("group_size") - .num_args(1) - .value_name("ENDIANNESS") - .value_parser(["big", "little"]) - .default_value("big") - .help( - "Whether to print out the data in little endian format or big endian format.", - ), ); let matches = command.get_matches(); From 580f865c4ab7b6b7dd3d15c17a6c291ef68a47cf Mon Sep 17 00:00:00 2001 From: David Peter Date: Tue, 25 Apr 2023 08:50:55 +0200 Subject: [PATCH 10/12] Rename function --- src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6ee6ec6..bb13e71 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -540,7 +540,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { Ok(()) } - fn reorder_buf_to_little_endian(&self, buf: &mut Vec) { + fn reorder_buffer_to_little_endian(&self, buf: &mut Vec) { let n = buf.len(); let group_sz = self.group_size as usize; @@ -556,8 +556,7 @@ impl<'a, Writer: Write> Printer<'a, Writer> { let mut buf = self.line_buf.clone(); if matches!(self.endianness, Endianness::Little) { - // reorder the buffer to the little endian format - self.reorder_buf_to_little_endian(&mut buf); + self.reorder_buffer_to_little_endian(&mut buf); }; for (i, &b) in buf.iter().enumerate() { From cba717b7832c51e0196c96160cab09744b708b0a Mon Sep 17 00:00:00 2001 From: David Peter Date: Tue, 25 Apr 2023 08:51:31 +0200 Subject: [PATCH 11/12] Minor doc comment adjustment --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index bb13e71..410a897 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -267,7 +267,7 @@ pub struct Printer<'a, Writer: Write> { group_size: u8, /// The number of digits used to write the base. base_digits: u8, - /// Whether to show groups in little or big endian ordering. + /// Whether to show groups in little or big endian format. endianness: Endianness, } From 9be018fbb9f5d7be00f05933714bb78f0a7f6ca8 Mon Sep 17 00:00:00 2001 From: David Peter Date: Tue, 25 Apr 2023 09:12:26 +0200 Subject: [PATCH 12/12] Add -e alias for --endianness=little --- src/bin/hexyl.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/bin/hexyl.rs b/src/bin/hexyl.rs index cc7fe8f..f59640d 100644 --- a/src/bin/hexyl.rs +++ b/src/bin/hexyl.rs @@ -190,9 +190,18 @@ fn run() -> Result<()> { .help( "Whether to print out groups in little-endian or big-endian \ format. This option only has an effect if the '--group-size' \ - is larger than 1.", + is larger than 1. '-e' can be used as an alias for \ + '--endianness=little'.", ), ) + .arg( + Arg::new("little_endian_format") + .short('e') + .action(ArgAction::SetTrue) + .overrides_with("endianness") + .hide(true) + .help("An alias for '--endianness=little'."), + ) .arg( Arg::new("base") .short('b') @@ -440,9 +449,14 @@ fn run() -> Result<()> { ) }; - let endianness = match matches.get_one::("endianness").map(String::as_ref) { - Some("little") => Endianness::Little, - Some("big") => Endianness::Big, + let little_endian_format = *matches.get_one::("little_endian_format").unwrap(); + let endianness = matches.get_one::("endianness"); + let endianness = match ( + endianness.map(|s| s.as_ref()).unwrap(), + little_endian_format, + ) { + (_, true) | ("little", _) => Endianness::Little, + ("big", _) => Endianness::Big, _ => unreachable!(), }; let stdout = io::stdout();