feat: output raw binary #26

This commit is contained in:
Christoph J. Scherr 2024-09-06 11:58:40 +02:00
parent e210b688f8
commit d315e24034
Signed by: cscherrNT
GPG Key ID: 8E2B45BC51A27EA7
2 changed files with 30 additions and 9 deletions

View File

@ -21,20 +21,25 @@
//! assert_eq!(Format::Hex.format(0x1337, &options), vec![48, 120, 49, 51, 51, 55]); //! 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 anyhow::anyhow;
use clap::{ArgGroup, Parser}; use clap::{ArgGroup, Parser};
use libpt::bintols::{join, split}; use libpt::bintols::{join, split};
use libpt::cli::args::VerbosityLevel; use libpt::cli::args::VerbosityLevel;
use libpt::log::debug; use libpt::log::{debug, trace};
/// The number type [numf](crate) uses /// The number type [numf](crate) uses
pub type NumberType = u128; pub type NumberType = u128;
/// formats supported by numf /// formats supported by numf
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Default)]
pub enum Format { pub enum Format {
Dec, Dec,
#[default]
Hex, Hex,
Bin, Bin,
Octal, Octal,
@ -44,6 +49,12 @@ pub enum Format {
Raw, 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 /// Describes what the formatter should do
/// ///
/// Use [Self::default] to get a basic variant or create a object yourself. /// 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. /// For example, `0b1100` will be `0b00001100` with this.
/// This does not apply to all formats, only hexadecimal and binary. /// This does not apply to all formats, only hexadecimal and binary.
padding: bool, padding: bool,
#[arg(short = 'x', long, default_value_t = true)] #[arg(short = 'x', long)]
/// format to hexadecimal /// format to hexadecimal
hex: bool, hex: bool,
#[arg(short, long)] #[arg(short, long)]
@ -137,6 +148,7 @@ pub struct FormatOptions {
impl FormatOptions { impl FormatOptions {
/// get the format that the user has configured /// get the format that the user has configured
pub fn format(&self) -> Format { pub fn format(&self) -> Format {
trace!("self.hex: {}", self.hex);
if self.oct { if self.oct {
Format::Octal Format::Octal
} else if self.bin { } else if self.bin {
@ -152,7 +164,9 @@ impl FormatOptions {
} else if self.raw { } else if self.raw {
Format::Raw Format::Raw
} else { } 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, padding: false,
prefix: false, prefix: false,
oct: false, oct: false,
hex: true, hex: false,
bin: false, bin: false,
raw: false, raw: false,
base32: false, base32: false,
@ -283,6 +297,7 @@ impl Format {
/// format a number with a [Format] and [FormatOptions] /// format a number with a [Format] and [FormatOptions]
pub fn format(&self, num: NumberType, options: &FormatOptions) -> Vec<u8> { pub fn format(&self, num: NumberType, options: &FormatOptions) -> Vec<u8> {
debug!("formatting mode: {self}");
let mut buf: Vec<u8> = Vec::new(); let mut buf: Vec<u8> = Vec::new();
if options.prefix() { if options.prefix() {
buf.append(&mut self.prefix()); buf.append(&mut self.prefix());
@ -320,7 +335,11 @@ impl Format {
.as_bytes() .as_bytes()
.to_owned(), .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 buf
} }

View File

@ -4,9 +4,9 @@ use std::process::exit;
use clap::{CommandFactory, Parser}; use clap::{CommandFactory, Parser};
mod format; mod format;
use crate::format::{numf_parser, Format};
use format::*; use format::*;
use libpt::log::debug; use libpt::log::debug;
use numf::format::numf_parser;
fn main() -> anyhow::Result<()> { fn main() -> anyhow::Result<()> {
// try to read from stdin first, appending the numbers we read to the FormatOptions // 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 { for o in out {
let mut stdout = std::io::stdout(); let mut stdout = std::io::stdout();
stdout.write_all(&o)?; stdout.write_all(&o)?;
if options.format() != Format::Raw {
stdout.write_all(b"\n")?; stdout.write_all(b"\n")?;
}
stdout.flush()?; stdout.flush()?;
} }
Ok(()) Ok(())