summaryrefslogtreecommitdiffstats
path: root/third_party/rust/base64/examples
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/base64/examples
parentInitial commit. (diff)
downloadfirefox-esr-upstream.tar.xz
firefox-esr-upstream.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/base64/examples')
-rw-r--r--third_party/rust/base64/examples/base64.rs89
1 files changed, 89 insertions, 0 deletions
diff --git a/third_party/rust/base64/examples/base64.rs b/third_party/rust/base64/examples/base64.rs
new file mode 100644
index 0000000000..0a214d2829
--- /dev/null
+++ b/third_party/rust/base64/examples/base64.rs
@@ -0,0 +1,89 @@
+use std::fs::File;
+use std::io::{self, Read};
+use std::path::PathBuf;
+use std::process;
+use std::str::FromStr;
+
+use base64::{alphabet, engine, read, write};
+use structopt::StructOpt;
+
+#[derive(Debug, StructOpt)]
+enum Alphabet {
+ Standard,
+ UrlSafe,
+}
+
+impl Default for Alphabet {
+ fn default() -> Self {
+ Self::Standard
+ }
+}
+
+impl FromStr for Alphabet {
+ type Err = String;
+ fn from_str(s: &str) -> Result<Self, String> {
+ match s {
+ "standard" => Ok(Self::Standard),
+ "urlsafe" => Ok(Self::UrlSafe),
+ _ => Err(format!("alphabet '{}' unrecognized", s)),
+ }
+ }
+}
+
+/// Base64 encode or decode FILE (or standard input), to standard output.
+#[derive(Debug, StructOpt)]
+struct Opt {
+ /// decode data
+ #[structopt(short = "d", long = "decode")]
+ decode: bool,
+ /// The alphabet to choose. Defaults to the standard base64 alphabet.
+ /// Supported alphabets include "standard" and "urlsafe".
+ #[structopt(long = "alphabet")]
+ alphabet: Option<Alphabet>,
+ /// The file to encode/decode.
+ #[structopt(parse(from_os_str))]
+ file: Option<PathBuf>,
+}
+
+fn main() {
+ let opt = Opt::from_args();
+ let stdin;
+ let mut input: Box<dyn Read> = match opt.file {
+ None => {
+ stdin = io::stdin();
+ Box::new(stdin.lock())
+ }
+ Some(ref f) if f.as_os_str() == "-" => {
+ stdin = io::stdin();
+ Box::new(stdin.lock())
+ }
+ Some(f) => Box::new(File::open(f).unwrap()),
+ };
+
+ let alphabet = opt.alphabet.unwrap_or_default();
+ let engine = engine::GeneralPurpose::new(
+ &match alphabet {
+ Alphabet::Standard => alphabet::STANDARD,
+ Alphabet::UrlSafe => alphabet::URL_SAFE,
+ },
+ engine::general_purpose::PAD,
+ );
+
+ let stdout = io::stdout();
+ let mut stdout = stdout.lock();
+ let r = if opt.decode {
+ let mut decoder = read::DecoderReader::new(&mut input, &engine);
+ io::copy(&mut decoder, &mut stdout)
+ } else {
+ let mut encoder = write::EncoderWriter::new(&mut stdout, &engine);
+ io::copy(&mut input, &mut encoder)
+ };
+ if let Err(e) = r {
+ eprintln!(
+ "Base64 {} failed with {}",
+ if opt.decode { "decode" } else { "encode" },
+ e
+ );
+ process::exit(1);
+ }
+}