generated from PlexSheep/rs-base
feat(rand): add rand option to FormatOptions
cargo devel CI / cargo CI (push) Successful in 1m33s
Details
cargo devel CI / cargo CI (push) Successful in 1m33s
Details
The user can now specify how many rand values to add to the list. The Cli needed some minor changes. Refs: #21 #19
This commit is contained in:
parent
826c3c7893
commit
0923bf5247
|
@ -19,4 +19,5 @@ clap = { version = "4.5.4", features = ["derive"] }
|
||||||
fast32 = "1.0.2"
|
fast32 = "1.0.2"
|
||||||
libpt = { version = "0.5.1", features = ["bintols"], default-features = false }
|
libpt = { version = "0.5.1", features = ["bintols"], default-features = false }
|
||||||
num = "0.4.3"
|
num = "0.4.3"
|
||||||
|
rand = "0.8.5"
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,11 @@ pub struct FormatOptions {
|
||||||
#[arg(short = 's', long)]
|
#[arg(short = 's', long)]
|
||||||
/// format to base64
|
/// format to base64
|
||||||
base64: bool,
|
base64: bool,
|
||||||
|
#[arg(short = 'r', long, default_value_t = 0)]
|
||||||
|
/// output random numbers
|
||||||
|
///
|
||||||
|
/// Add a user defined amount of cryptographically pseudorandom numbers to the number list.
|
||||||
|
rand: usize,
|
||||||
#[arg(short = 'z', long)]
|
#[arg(short = 'z', long)]
|
||||||
/// format to base32
|
/// format to base32
|
||||||
base32: bool,
|
base32: bool,
|
||||||
|
@ -183,6 +188,16 @@ impl FormatOptions {
|
||||||
pub fn push_number(&mut self, value: NumberType) {
|
pub fn push_number(&mut self, value: NumberType) {
|
||||||
self.numbers.push(value)
|
self.numbers.push(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// get rand
|
||||||
|
pub fn rand(&self) -> usize {
|
||||||
|
self.rand
|
||||||
|
}
|
||||||
|
|
||||||
|
/// set amount of extra random numbers manually
|
||||||
|
pub fn set_rand(&mut self, rand: usize) {
|
||||||
|
self.rand = rand;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for FormatOptions {
|
impl Default for FormatOptions {
|
||||||
|
@ -197,6 +212,7 @@ impl Default for FormatOptions {
|
||||||
base64: false,
|
base64: false,
|
||||||
dec: false,
|
dec: false,
|
||||||
numbers: vec![],
|
numbers: vec![],
|
||||||
|
rand: 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
22
src/main.rs
22
src/main.rs
|
@ -10,9 +10,9 @@ use clap::{CommandFactory, Parser};
|
||||||
|
|
||||||
mod format;
|
mod format;
|
||||||
use format::*;
|
use format::*;
|
||||||
use numf::format::numf_parser;
|
use numf::format::{numf_parser, NumberType};
|
||||||
|
|
||||||
fn main() {
|
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
|
||||||
let mut options = FormatOptions::parse();
|
let mut options = FormatOptions::parse();
|
||||||
let mut stdin_nums = Vec::new();
|
let mut stdin_nums = Vec::new();
|
||||||
|
@ -23,6 +23,7 @@ fn main() {
|
||||||
let whole: String = match String::from_utf8(stdin_nums) {
|
let whole: String = match String::from_utf8(stdin_nums) {
|
||||||
Ok(r) => r,
|
Ok(r) => r,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
eprintln!("{}", FormatOptions::command().render_usage());
|
||||||
eprintln!("stdin for this program only accepts text: {e:#?}");
|
eprintln!("stdin for this program only accepts text: {e:#?}");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +33,7 @@ fn main() {
|
||||||
let number = match numf_parser(s) {
|
let number = match numf_parser(s) {
|
||||||
Ok(n) => n,
|
Ok(n) => n,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
eprintln!("{}", FormatOptions::command().render_usage());
|
||||||
eprintln!("could not parse number from stdin: {e:#?}");
|
eprintln!("could not parse number from stdin: {e:#?}");
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
@ -40,14 +42,27 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
eprintln!("{}", FormatOptions::command().render_usage());
|
||||||
eprintln!("could not read from stdin: {e:#?}");
|
eprintln!("could not read from stdin: {e:#?}");
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.rand() > 0 {
|
||||||
|
use rand::prelude::*;
|
||||||
|
let mut rand = rand::rngs::OsRng;
|
||||||
|
for _i in 0..options.rand() {
|
||||||
|
let mut by: [u8; 16] = [0; 16];
|
||||||
|
rand.fill_bytes(&mut by);
|
||||||
|
let n: NumberType = libpt::bintols::join::array_to_unsigned(&by)?;
|
||||||
|
options.push_number(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if options.numbers().is_empty() {
|
if options.numbers().is_empty() {
|
||||||
format!("{}", FormatOptions::command().render_usage());
|
eprintln!("{}", FormatOptions::command().render_usage());
|
||||||
|
eprintln!("no numbers have been provided");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,4 +74,5 @@ fn main() {
|
||||||
for o in out {
|
for o in out {
|
||||||
println!("{o}")
|
println!("{o}")
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue