use pin_project_lite::pin_project; use std::{ops::Deref, sync::Arc}; #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub(crate) struct PercentDecodedStr(Arc); impl PercentDecodedStr { pub(crate) fn new(s: S) -> Option where S: AsRef, { percent_encoding::percent_decode(s.as_ref().as_bytes()) .decode_utf8() .ok() .map(|decoded| Self(decoded.as_ref().into())) } pub(crate) fn as_str(&self) -> &str { &self.0 } pub(crate) fn into_inner(self) -> Arc { self.0 } } impl Deref for PercentDecodedStr { type Target = str; #[inline] fn deref(&self) -> &Self::Target { self.as_str() } } pin_project! { #[project = EitherProj] pub(crate) enum Either { A { #[pin] inner: A }, B { #[pin] inner: B }, } } pub(crate) fn try_downcast(k: K) -> Result where T: 'static, K: Send + 'static, { let mut k = Some(k); if let Some(k) = ::downcast_mut::>(&mut k) { Ok(k.take().unwrap()) } else { Err(k.unwrap()) } } #[test] fn test_try_downcast() { assert_eq!(try_downcast::(5_u32), Err(5_u32)); assert_eq!(try_downcast::(5_i32), Ok(5_i32)); }