use std::str::FromStr;
use destream::{de, en};
use super::{Host, Link, PathBuf};
impl de::FromStream for Host {
type Context = ();
async fn from_stream<D: de::Decoder>(cxt: (), decoder: &mut D) -> Result<Self, D::Error> {
let s = String::from_stream(cxt, decoder).await?;
Self::from_str(&s).map_err(de::Error::custom)
}
}
impl<'en> en::ToStream<'en> for Host {
fn to_stream<E: en::Encoder<'en>>(&'en self, e: E) -> Result<E::Ok, E::Error> {
e.encode_str(self.to_string().as_str())
}
}
impl<'en> en::IntoStream<'en> for Host {
fn into_stream<E: en::Encoder<'en>>(self, e: E) -> Result<E::Ok, E::Error> {
e.encode_str(self.to_string().as_str())
}
}
impl de::FromStream for Link {
type Context = ();
async fn from_stream<D: de::Decoder>(cxt: (), decoder: &mut D) -> Result<Link, D::Error> {
let s = String::from_stream(cxt, decoder).await?;
s.parse().map_err(de::Error::custom)
}
}
impl<'en> en::ToStream<'en> for Link {
fn to_stream<E: en::Encoder<'en>>(&'en self, e: E) -> Result<E::Ok, E::Error> {
en::IntoStream::into_stream(self.to_string(), e)
}
}
impl<'en> en::IntoStream<'en> for Link {
fn into_stream<E: en::Encoder<'en>>(self, e: E) -> Result<E::Ok, E::Error> {
en::IntoStream::into_stream(self.to_string(), e)
}
}
impl de::FromStream for PathBuf {
type Context = ();
async fn from_stream<D: de::Decoder>(
context: (),
decoder: &mut D,
) -> Result<PathBuf, D::Error> {
let s = String::from_stream(context, decoder).await?;
s.parse().map_err(de::Error::custom)
}
}
impl<'en> en::IntoStream<'en> for PathBuf {
fn into_stream<E: en::Encoder<'en>>(self, e: E) -> Result<E::Ok, E::Error> {
e.encode_str(&self.to_string())
}
}
impl<'en> en::ToStream<'en> for PathBuf {
fn to_stream<E: en::Encoder<'en>>(&'en self, e: E) -> Result<E::Ok, E::Error> {
e.encode_str(&self.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
fn assert_destream<T>()
where
T: de::FromStream<Context = ()>,
for<'en> T: en::ToStream<'en> + en::IntoStream<'en>,
{
}
#[test]
fn host_link_pathbuf_have_destream_impls() {
assert_destream::<Host>();
assert_destream::<Link>();
assert_destream::<PathBuf>();
}
}