feat: v0.1.1, support width and pem feature

This commit is contained in:
2024-09-09 23:55:40 +08:00
parent d8a88d0529
commit 9d10c5fe07
7 changed files with 64 additions and 14 deletions

2
Cargo.lock generated
View File

@@ -144,7 +144,7 @@ dependencies = [
[[package]] [[package]]
name = "encode" name = "encode"
version = "0.1.0" version = "0.1.1"
dependencies = [ dependencies = [
"base58", "base58",
"base64", "base64",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "encode" name = "encode"
version = "0.1.0" version = "0.1.1"
edition = "2021" edition = "2021"
[dependencies] [dependencies]

View File

@@ -19,7 +19,7 @@ pub struct CmdBase58 {
} }
impl CmdExec for CmdBase58 { impl CmdExec for CmdBase58 {
fn exec(&self) -> XResult<()> { fn exec(&mut self) -> XResult<()> {
if self.encode && self.decode { if self.encode && self.decode {
return simple_error!("Encode and decode cannot both assigned."); return simple_error!("Encode and decode cannot both assigned.");
} }

View File

@@ -1,4 +1,4 @@
use crate::util::read_file_or_stdin; use crate::util::{read_file_or_stdin, split_output_buff};
use crate::CmdExec; use crate::CmdExec;
use base64::engine::general_purpose::{ use base64::engine::general_purpose::{
STANDARD, STANDARD_NO_PAD, STANDARD, STANDARD_NO_PAD,
@@ -23,13 +23,19 @@ pub struct CmdBase64 {
/// No pad /// No pad
#[arg(long, short = 'P')] #[arg(long, short = 'P')]
pub no_pad: bool, pub no_pad: bool,
/// Width
#[arg(long, short = 'w')]
pub width: Option<usize>,
/// PEM
#[arg(long)]
pub pem: Option<String>,
/// Input file /// Input file
#[arg(long, short = 'i')] #[arg(long, short = 'i')]
pub r#in: Option<String>, pub r#in: Option<String>,
} }
impl CmdExec for CmdBase64 { impl CmdExec for CmdBase64 {
fn exec(&self) -> XResult<()> { fn exec(&mut self) -> XResult<()> {
if self.encode && self.decode { if self.encode && self.decode {
return simple_error!("Encode and decode cannot both assigned."); return simple_error!("Encode and decode cannot both assigned.");
} }
@@ -47,7 +53,25 @@ impl CmdExec for CmdBase64 {
std::io::stdout().write_all(&decoded)?; std::io::stdout().write_all(&decoded)?;
} else { } else {
let encoded = encoder.encode(&input); let encoded = encoder.encode(&input);
print!("{}", encoded); if let (Some(_), None) = (&self.pem, self.width) {
self.width = Some(64);
}
let encoded_width = match self.width {
None => encoded,
Some(w) => {
let mut buff = String::with_capacity(encoded.len() + 100);
match &self.pem {
None => split_output_buff(&mut buff, &encoded, w)?,
Some(pem) => {
buff.push_str(&format!("-----BEGIN {}-----\n", pem));
split_output_buff(&mut buff, &encoded, w)?;
buff.push_str(&format!("\n-----END {}-----", pem));
}
}
buff
}
};
print!("{}", encoded_width);
} }
Ok(()) Ok(())
} }

View File

@@ -1,4 +1,4 @@
use crate::util::read_file_or_stdin; use crate::util::{read_file_or_stdin, split_output};
use crate::CmdExec; use crate::CmdExec;
use clap::Args; use clap::Args;
use rust_util::{opt_result, simple_error, XResult}; use rust_util::{opt_result, simple_error, XResult};
@@ -15,13 +15,16 @@ pub struct CmdHex {
/// Upper case /// Upper case
#[arg(long, short = 'u')] #[arg(long, short = 'u')]
pub upper_case: bool, pub upper_case: bool,
/// Width
#[arg(long, short = 'w')]
pub width: Option<usize>,
/// Input file /// Input file
#[arg(long, short = 'i')] #[arg(long, short = 'i')]
pub r#in: Option<String>, pub r#in: Option<String>,
} }
impl CmdExec for CmdHex { impl CmdExec for CmdHex {
fn exec(&self) -> XResult<()> { fn exec(&mut self) -> XResult<()> {
if self.encode && self.decode { if self.encode && self.decode {
return simple_error!("Encode and decode cannot both assigned."); return simple_error!("Encode and decode cannot both assigned.");
} }
@@ -37,7 +40,11 @@ impl CmdExec for CmdHex {
} else { } else {
hex::encode(&input) hex::encode(&input)
}; };
print!("{}", encoded); let encoded_width = match self.width {
None => encoded,
Some(w) => split_output(&encoded, w)?,
};
print!("{}", encoded_width);
} }
Ok(()) Ok(())
} }

View File

@@ -18,7 +18,7 @@ struct Cli {
} }
trait CmdExec { trait CmdExec {
fn exec(&self) -> XResult<()>; fn exec(&mut self) -> XResult<()>;
} }
#[derive(Debug, Subcommand)] #[derive(Debug, Subcommand)]
@@ -44,8 +44,8 @@ fn main() {
fn inner_main() -> XResult<()> { fn inner_main() -> XResult<()> {
let cli = Cli::parse(); let cli = Cli::parse();
match cli.command { match cli.command {
Commands::Hex(cmd_hex) => cmd_hex.exec(), Commands::Hex(mut cmd_hex) => cmd_hex.exec(),
Commands::Base64(cmd_base64) => cmd_base64.exec(), Commands::Base64(mut cmd_base64) => cmd_base64.exec(),
Commands::Base58(cmd_base58) => cmd_base58.exec(), Commands::Base58(mut cmd_base58) => cmd_base58.exec(),
} }
} }

View File

@@ -1,4 +1,4 @@
use rust_util::{opt_result, XResult}; use rust_util::{opt_result, simple_error, XResult};
use std::fs; use std::fs;
use std::io::Read; use std::io::Read;
@@ -23,3 +23,22 @@ pub fn read_stdin() -> XResult<Vec<u8>> {
opt_result!(stdin.read_to_end(&mut buffer), "Read stdin failed: {}"); opt_result!(stdin.read_to_end(&mut buffer), "Read stdin failed: {}");
Ok(buffer) Ok(buffer)
} }
pub fn split_output(output: &str, width: usize) -> XResult<String> {
let mut buff = String::with_capacity(output.len() + 100);
split_output_buff(&mut buff, output, width)?;
Ok(buff)
}
pub fn split_output_buff(output_buffer: &mut String, output: &str, width: usize) -> XResult<()> {
if width == 0 {
return simple_error!("Width must be greater than zero.");
}
for (i, c) in output.chars().enumerate() {
if i > 0 && i % width == 0 {
output_buffer.push('\n');
}
output_buffer.push(c);
}
Ok(())
}