use derive_more::derive::{Display, From}; #[derive(Debug, PartialEq, Eq)] pub struct SessionKey(String); impl TryFrom for SessionKey { type Error = InvalidSessionKeyError; fn try_from(val: String) -> Result { if val.len() > 4064 { return Err(anyhow::anyhow!( "The session key is bigger than 4064 bytes, the upper limit on cookie content." ) .into()); } if val.contains('\0') { return Err(anyhow::anyhow!( "The session key contains null bytes which are not allowed." ) .into()); } Ok(SessionKey(val)) } } impl AsRef for SessionKey { fn as_ref(&self) -> &str { &self.0 } } impl From for String { fn from(key: SessionKey) -> Self { key.0 } } #[derive(Debug, Display, From)] #[display("The provided string is not a valid session key")] pub struct InvalidSessionKeyError(anyhow::Error); impl std::error::Error for InvalidSessionKeyError { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(self.0.as_ref()) } }