From d315e24034b22615440f2e96cd5d50096ea62abd Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 6 Sep 2024 11:58:40 +0200 Subject: [PATCH] feat: output raw binary #26 --- src/format.rs | 33 ++++++++++++++++++++++++++------- src/main.rs | 6 ++++-- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/format.rs b/src/format.rs index 39d5a50..0d4c66e 100644 --- a/src/format.rs +++ b/src/format.rs @@ -21,20 +21,25 @@ //! assert_eq!(Format::Hex.format(0x1337, &options), vec![48, 120, 49, 51, 51, 55]); //! ``` -#![allow(dead_code)] // this is exported to lib.rs +#![allow(dead_code)] +use std::default; +use std::fmt::Display; + +// this is exported to lib.rs use anyhow::anyhow; use clap::{ArgGroup, Parser}; use libpt::bintols::{join, split}; use libpt::cli::args::VerbosityLevel; -use libpt::log::debug; +use libpt::log::{debug, trace}; /// The number type [numf](crate) uses pub type NumberType = u128; /// formats supported by numf -#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] +#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Default)] pub enum Format { Dec, + #[default] Hex, Bin, Octal, @@ -44,6 +49,12 @@ pub enum Format { Raw, } +impl Display for Format { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{self:?}") + } +} + /// Describes what the formatter should do /// /// Use [Self::default] to get a basic variant or create a object yourself. @@ -78,7 +89,7 @@ pub struct FormatOptions { /// For example, `0b1100` will be `0b00001100` with this. /// This does not apply to all formats, only hexadecimal and binary. padding: bool, - #[arg(short = 'x', long, default_value_t = true)] + #[arg(short = 'x', long)] /// format to hexadecimal hex: bool, #[arg(short, long)] @@ -137,6 +148,7 @@ pub struct FormatOptions { impl FormatOptions { /// get the format that the user has configured pub fn format(&self) -> Format { + trace!("self.hex: {}", self.hex); if self.oct { Format::Octal } else if self.bin { @@ -152,7 +164,9 @@ impl FormatOptions { } else if self.raw { Format::Raw } else { - unreachable!() + // none was explicitly selected + debug!("no mode was explicitly selected, going with the default"); + Format::default() } } @@ -238,7 +252,7 @@ impl Default for FormatOptions { padding: false, prefix: false, oct: false, - hex: true, + hex: false, bin: false, raw: false, base32: false, @@ -283,6 +297,7 @@ impl Format { /// format a number with a [Format] and [FormatOptions] pub fn format(&self, num: NumberType, options: &FormatOptions) -> Vec { + debug!("formatting mode: {self}"); let mut buf: Vec = Vec::new(); if options.prefix() { buf.append(&mut self.prefix()); @@ -320,7 +335,11 @@ impl Format { .as_bytes() .to_owned(), ), - Format::Raw => buf.append(&mut split::unsigned_to_vec(num)), + // Format::Raw => buf.append(&mut split::unsigned_to_vec(num)), + Format::Raw => { + debug!("do the raw thing"); + buf.append(&mut split::unsigned_to_vec(num)) + } } buf } diff --git a/src/main.rs b/src/main.rs index 1a39379..28790f2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,9 @@ use std::process::exit; use clap::{CommandFactory, Parser}; mod format; +use crate::format::{numf_parser, Format}; use format::*; use libpt::log::debug; -use numf::format::numf_parser; fn main() -> anyhow::Result<()> { // try to read from stdin first, appending the numbers we read to the FormatOptions @@ -79,7 +79,9 @@ fn main() -> anyhow::Result<()> { for o in out { let mut stdout = std::io::stdout(); stdout.write_all(&o)?; - stdout.write_all(b"\n")?; + if options.format() != Format::Raw { + stdout.write_all(b"\n")?; + } stdout.flush()?; } Ok(())