chiark / gitweb /
AssetUrlKey: parse and display
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 4 May 2021 00:09:12 +0000 (01:09 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 4 May 2021 11:19:27 +0000 (12:19 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Cargo.lock
Cargo.toml
src/bundles.rs
src/imports.rs

index 690f27cba666bea5366db5c0a8cfb5f73a938a1a..dda0ee9e990d617d2243911312c16b610987cd70 100644 (file)
@@ -2188,6 +2188,7 @@ dependencies = [
  "anyhow",
  "argparse",
  "backtrace",
+ "base64 0.13.0",
  "boolinator",
  "bundle-sources",
  "byteorder",
index 24c608257c780ca8cc97edf938c74b52640dacc8..dc43c5140d931a3cb7297293fef9b525b31539c9 100644 (file)
@@ -31,6 +31,7 @@ otter-base.version="=0.5.1"
 anyhow="1"
 argparse="0.2"
 backtrace="0.3"
+base64="0.13"
 boolinator="2"
 byteorder="1.3"
 cast_trait_object="0.1"
index 96b4919079b241fae445361c00da9e15bbef1ed5..4bf8358bfc13e43b0a941460c52cbb6019530ee9 100644 (file)
@@ -73,8 +73,9 @@ impl AssetUrlKey {
     AssetUrlKey::Y(buf)
   }
 }
+type AssetUrlTokenRaw = digest::Output<Digester>;
 #[derive(Clone)]
-pub struct AssetUrlToken(digest::Output<Digester>);
+pub struct AssetUrlToken(AssetUrlTokenRaw);
 impl Debug for AssetUrlToken {
   #[throws(fmt::Error)]
   fn fmt(&self, f: &mut Formatter) { write!(f, "AssetUrlToken{{..}}")?; }
@@ -93,6 +94,27 @@ impl AssetUrlKey {
     AssetUrlToken(dw.finish().0)
   }
 }
+impl Display for AssetUrlToken {
+  #[throws(fmt::Error)]
+  fn fmt(&self, f: &mut Formatter) {
+    f.write_str(&base64::encode_config(&self.0, base64::URL_SAFE_NO_PAD))?
+  }
+}
+impl FromStr for AssetUrlToken {
+  type Err = BadAssetUrlToken;
+  #[throws(BadAssetUrlToken)]
+  fn from_str(s: &str) -> Self {
+    let mut buf: AssetUrlTokenRaw = default();
+    let l = base64::decode_config_slice(
+      s.as_bytes(), base64::URL_SAFE_NO_PAD, &mut buf)
+      .map_err(|_| BadAssetUrlToken)?;
+    if l != buf.len() { throw!(BadAssetUrlToken) }
+    AssetUrlToken(buf)
+  }
+}
+#[derive(Error,Debug,Copy,Clone,Serialize)]
+pub struct BadAssetUrlToken;
+display_as_debug!{BadAssetUrlToken}
 
 #[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,Ord,PartialOrd)]
 #[derive(Serialize,Deserialize)]
index 00a01274620b01c22156ec73754b5e6054c4a752..5608f67f394606ef5d58cf60f612f8b40386c6a4 100644 (file)
@@ -6,6 +6,7 @@ pub use otter_base;
 pub use otter_base::imports::*;
 
 pub use anyhow;
+pub use base64;
 pub use boolinator;
 pub use cast_trait_object;
 pub use chrono;