From 9bc4b57058be2106d47a90888952d87549ff186f Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 12 Dec 2020 15:35:33 +0000 Subject: [PATCH] :star: new (ptth_relay): add serde deserializer for blake3 hashes --- crates/ptth_relay/src/config.rs | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/crates/ptth_relay/src/config.rs b/crates/ptth_relay/src/config.rs index f8ad9bd..4e8a707 100644 --- a/crates/ptth_relay/src/config.rs +++ b/crates/ptth_relay/src/config.rs @@ -4,18 +4,68 @@ use std::{ collections::HashMap, convert::{TryFrom, TryInto}, + fmt, iter::FromIterator, + ops::Deref, path::Path, }; +use serde::{ + Deserialize, + Deserializer, + de::{ + self, + Visitor, + }, +}; + use crate::errors::ConfigError; +pub struct BlakeHashWrapper (blake3::Hash); + +impl Deref for BlakeHashWrapper { + type Target = blake3::Hash; + + fn deref (&self) -> &::Target { + &self.0 + } +} + +struct BlakeHashVisitor; + +impl <'de> Visitor <'de> for BlakeHashVisitor { + type Value = blake3::Hash; + + fn expecting (&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str ("a 32-byte blake3 hash, encoded as base64") + } + + fn visit_str (self, value: &str) + -> Result + { + let bytes: Vec = base64::decode (value).map_err (|_| E::custom (format! ("str is not base64: {}", value)))?; + let bytes: [u8; 32] = (&bytes [..]).try_into ().map_err (|_| E::custom (format! ("decode base64 is not 32 bytes long: {}", value)))?; + + let tripcode = blake3::Hash::from (bytes); + + Ok (tripcode) + } +} + +impl <'de> Deserialize <'de> for BlakeHashWrapper { + fn deserialize > (deserializer: D) -> Result { + Ok (BlakeHashWrapper (deserializer.deserialize_str (BlakeHashVisitor)?)) + } +} + // Stuff we need to load from the config file and use to // set up the HTTP server pub mod file { use serde::Deserialize; + use super::*; + #[derive (Deserialize)] pub struct Server { pub name: String, @@ -31,6 +81,8 @@ pub mod file { pub enable_dev_mode: bool, #[serde (default)] pub enable_scraper_auth: bool, + + pub dev_scraper_key: Option , } #[derive (Deserialize)]