From 9a3e40012ac7936a72bdbb705f463553b9ba9c3d Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 4 May 2021 01:09:12 +0100 Subject: [PATCH] AssetUrlKey: parse and display Signed-off-by: Ian Jackson --- Cargo.lock | 1 + Cargo.toml | 1 + src/bundles.rs | 24 +++++++++++++++++++++++- src/imports.rs | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 690f27cb..dda0ee9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2188,6 +2188,7 @@ dependencies = [ "anyhow", "argparse", "backtrace", + "base64 0.13.0", "boolinator", "bundle-sources", "byteorder", diff --git a/Cargo.toml b/Cargo.toml index 24c60825..dc43c514 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/bundles.rs b/src/bundles.rs index 96b49190..4bf8358b 100644 --- a/src/bundles.rs +++ b/src/bundles.rs @@ -73,8 +73,9 @@ impl AssetUrlKey { AssetUrlKey::Y(buf) } } +type AssetUrlTokenRaw = digest::Output; #[derive(Clone)] -pub struct AssetUrlToken(digest::Output); +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)] diff --git a/src/imports.rs b/src/imports.rs index 00a01274..5608f67f 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -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; -- 2.30.2