Replace the radix64 crate with base64
authorBenno Rice <benno.rice@oracle.com>
Tue, 3 Jan 2023 00:54:56 +0000 (11:54 +1100)
committerBenno Rice <benno.rice@oracle.com>
Tue, 3 Jan 2023 01:02:57 +0000 (12:02 +1100)
The radix64 crate was last updated over 3 years ago. On the other
hand the base64 crate appears to be far more actively maintained,
supports all the needed features and has a few orders of magnitude
more users.

Cargo.toml
rust-bindings/src/checksum.rs

index 31822af53efcf83a7bc69715065065b3ee012f80..726cf10b44688c46633e716fe462d299ff697f6d 100644 (file)
@@ -38,6 +38,7 @@ path = "rust-bindings/tests/tests.rs"
 members = [".", "rust-bindings/sys"]
 
 [dependencies]
+base64 = "0.20.0"
 bitflags = "1.2.1"
 cap-std = { version = "1.0", optional = true}
 io-lifetimes = { version = "1.0", optional = true}
@@ -47,7 +48,6 @@ glib = "0.16"
 hex = "0.4.2"
 libc = "0.2"
 once_cell = "1.4.0"
-radix64 = "0.6.2"
 thiserror = "1.0.20"
 
 [dev-dependencies]
index 4cc981645d383e6a932d26ab6c72816c093caf6d..d9e522f38247d8c4aa140dfb00ad208958cfa783 100644 (file)
@@ -1,23 +1,28 @@
+use base64::{
+    alphabet::Alphabet,
+    engine::fast_portable::{FastPortable, FastPortableConfig},
+    engine::DecodePaddingMode,
+};
 use glib::ffi::{g_free, g_malloc0, gpointer};
 use glib::translate::{FromGlibPtrFull, FromGlibPtrNone};
-use once_cell::sync::OnceCell;
+use once_cell::sync::Lazy;
 use std::ptr::copy_nonoverlapping;
 
 const BYTES_LEN: usize = ffi::OSTREE_SHA256_DIGEST_LEN as usize;
 
-static BASE64_CONFIG: OnceCell<radix64::CustomConfig> = OnceCell::new();
-
-fn base64_config() -> &'static radix64::CustomConfig {
-    BASE64_CONFIG.get_or_init(|| {
-        radix64::configs::CustomConfigBuilder::with_alphabet(
-            // modified base64 alphabet used by ostree (uses _ instead of /)
-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_",
-        )
-        .no_padding()
-        .build()
-        .unwrap()
-    })
-}
+static BASE64_ENGINE: Lazy<FastPortable> = Lazy::new(|| {
+    // modified base64 alphabet used by ostree (uses _ instead of /)
+    let alphabet =
+        Alphabet::from_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_")
+            .expect("bad base64 alphabet");
+
+    FastPortable::from(
+        &alphabet,
+        FastPortableConfig::new()
+            .with_encode_padding(false)
+            .with_decode_padding_mode(DecodePaddingMode::Indifferent),
+    )
+});
 
 /// Error returned from parsing a checksum.
 #[derive(Debug, thiserror::Error)]
@@ -61,7 +66,7 @@ impl Checksum {
     /// Create a `Checksum` from a base64-encoded String.
     pub fn from_base64(b64_checksum: &str) -> Result<Checksum, ChecksumError> {
         let mut checksum = Checksum::zeroed();
-        match base64_config().decode_slice(b64_checksum, checksum.as_mut()) {
+        match base64::decode_engine_slice(b64_checksum, checksum.as_mut(), &*BASE64_ENGINE) {
             Ok(BYTES_LEN) => Ok(checksum),
             Ok(_) => Err(ChecksumError::InvalidBase64String),
             Err(_) => Err(ChecksumError::InvalidBase64String),
@@ -75,7 +80,7 @@ impl Checksum {
 
     /// Convert checksum to base64 string.
     pub fn to_base64(&self) -> String {
-        base64_config().encode(self.as_slice())
+        base64::encode_engine(self.as_slice(), &*BASE64_ENGINE)
     }
 
     /// Create a `Checksum` value, taking ownership of the given memory location.