1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
use crate::{channel::Channel, kind, kind::Future, ConstructResult, DeconstructResult, Kind}; use futures::{SinkExt, StreamExt}; use url::{ParseError, Url}; use super::WrappedError; use void::Void; #[kind] impl Kind for Url { type ConstructItem = String; type ConstructError = WrappedError<ParseError>; type ConstructFuture = Future<ConstructResult<Self>>; type DeconstructItem = (); type DeconstructError = WrappedError<Void>; type DeconstructFuture = Future<DeconstructResult<Self>>; fn deconstruct<C: Channel<Self::DeconstructItem, Self::ConstructItem>>( self, mut channel: C, ) -> Self::DeconstructFuture { Box::pin(async move { Ok(channel .send(self.into_string()) .await .map_err(WrappedError::Send)?) }) } fn construct<C: Channel<Self::ConstructItem, Self::DeconstructItem>>( mut channel: C, ) -> Self::ConstructFuture { Box::pin(async move { Ok(channel .next() .await .ok_or(WrappedError::Insufficient { got: 0, expected: 1, })? .parse()?) }) } }