Skip to content

Commit

Permalink
fix: handle binary files in/out
Browse files Browse the repository at this point in the history
  • Loading branch information
uhmarcel committed Nov 20, 2022
1 parent 4ed8d10 commit 4dcc212
Show file tree
Hide file tree
Showing 8 changed files with 253 additions and 186 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rbase64"
version = "1.4.0"
version = "1.4.1"
edition = "2021"
description = "A simple base64 encoder / decoder CLI tool made in Rust"
authors = ["Marcel Riera <marcel.riera@outlook.com>"]
Expand Down
346 changes: 180 additions & 166 deletions benches/baseline.md

Large diffs are not rendered by default.

38 changes: 27 additions & 11 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,31 +28,47 @@ fn main() {
let args: Args = Args::parse();
let input = parse_input(args.input.or(args.argument));

let processed = if args.decode {
String::from_utf8(rbase64::decode(&input)).expect("Unable to parse utf8")
if args.decode {
let in_utf8 = String::from_utf8(input).expect("Invalid UTF8");
let out_bytes = rbase64::decode(&in_utf8);

output_bytes(args.output, &out_bytes);
} else {
rbase64::encode(&input.into_bytes())
};
let out_utf8 = rbase64::encode(&input);

output_str(args.output, &out_utf8);
}
}

match args.output {
Some(path) => {
fs::write(path, processed).expect("Failed to write output");
#[inline(always)]
fn output_bytes(output: Option<String>, bytes: &[u8]) {
match output {
Some(path) => fs::write(path, bytes).expect("Failed to write output"),
None => {
print!("{}", String::from_utf8_lossy(bytes));
}
}
}

#[inline(always)]
fn output_str(output: Option<String>, value: &str) {
match output {
Some(path) => fs::write(path, value).expect("Failed to write output"),
None => {
print!("{}", processed);
print!("{}", value);
}
}
}

fn parse_input(file: Option<String>) -> String {
fn parse_input(file: Option<String>) -> Vec<u8> {
match file {
Some(path) => fs::read_to_string(path).expect("Unable to load file"),
Some(path) => fs::read(path).expect("Unable to load file"),
None => {
let mut buffer: Vec<u8> = Vec::new();
io::stdin()
.read_to_end(&mut buffer)
.expect("Failed to read stdin");
String::from_utf8(buffer).expect("Failed to parse stdin")
buffer
}
}
}
50 changes: 43 additions & 7 deletions tests/cli-tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ fn given_invalid_stdin_and_decode_arg_expect_error() {
}

#[test]
fn given_input_arg_expect_encoded_string_in_stdout() {
let expected = fs::read_to_string("./tests/resources/utf8.base64").unwrap();
fn given_text_file_input_arg_expect_encoded_string_in_stdout() {
let expected = fs::read_to_string("./tests/resources/utf8.b64").unwrap();

Command::cargo_bin("rbase64")
.unwrap()
Expand All @@ -52,7 +52,7 @@ fn given_input_arg_expect_encoded_string_in_stdout() {

#[test]
fn given_positional_arg_expect_encoded_string_in_stdout() {
let expected = fs::read_to_string("./tests/resources/utf8.base64").unwrap();
let expected = fs::read_to_string("./tests/resources/utf8.b64").unwrap();

Command::cargo_bin("rbase64")
.unwrap()
Expand All @@ -69,7 +69,7 @@ fn given_input_arg_and_decode_arg_expect_decoded_string_in_stdout() {
Command::cargo_bin("rbase64")
.unwrap()
.arg("-i")
.arg("./tests/resources/utf8.base64")
.arg("./tests/resources/utf8.b64")
.arg("-d")
.assert()
.success()
Expand All @@ -78,8 +78,7 @@ fn given_input_arg_and_decode_arg_expect_decoded_string_in_stdout() {

#[test]
fn given_stdin_and_output_arg_expect_encoded_string_in_file() {
let filepath = format!("./tests/tmp/{}.txt", Utc::now().to_rfc3339());
fs::create_dir("./tests/tmp").ok();
let filepath = format!("./tests/t1-{}", Utc::now().to_rfc3339());

Command::cargo_bin("rbase64")
.unwrap()
Expand All @@ -93,5 +92,42 @@ fn given_stdin_and_output_arg_expect_encoded_string_in_file() {
let result = fs::read_to_string(&filepath).unwrap();
assert_eq!(result, "Y2xpZW50OnNlY3JldA==");

fs::remove_dir_all("./tests/tmp").unwrap();
fs::remove_file(&filepath).unwrap();
}

#[test]
fn given_binary_file_input_arg_expect_encoded_string_in_stdout() {
let expected = fs::read_to_string("./tests/resources/bytes.b64").unwrap();

Command::cargo_bin("rbase64")
.unwrap()
.arg("--input")
.arg("./tests/resources/bytes.bin")
.assert()
.success()
.stdout(expected);
}

#[test]
fn given_non_utf8_encoded_binary_and_output_arg_expect_decoded_binary_file() {
let filepath = format!("./tests/t2-{}.bin", Utc::now().to_rfc3339());

Command::cargo_bin("rbase64")
.unwrap()
.arg("--input")
.arg("./tests/resources/bytes.b64")
.arg("--output")
.arg(&filepath)
.arg("--decode")
.assert()
.success()
.stdout("");

let result = fs::read(&filepath).unwrap();
let expected = fs::read("./tests/resources/bytes.bin").unwrap();

assert_eq!(result.len(), expected.len());
assert_eq!(result, expected);

fs::remove_file(&filepath).unwrap();
}
1 change: 1 addition & 0 deletions tests/resources/bytes.b64
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
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
Binary file added tests/resources/bytes.bin
Binary file not shown.
File renamed without changes.

0 comments on commit 4dcc212

Please sign in to comment.