use std::convert::Infallible;
use std::fmt;
use bytes::Bytes;
use futures::Stream;
use uuid::Uuid;
mod impls;
pub trait Error {
fn custom<I: fmt::Display>(info: I) -> Self;
}
impl Error for Infallible {
fn custom<I: fmt::Display>(_info: I) -> Self {
panic!("Infallible operation failed!")
}
}
pub struct MapStream<K, V, S: Stream<Item = (K, V)>> {
source: S,
}
impl<'en, K: IntoStream<'en> + 'en, V: IntoStream<'en> + 'en, S: Stream<Item = (K, V)> + 'en>
MapStream<K, V, S>
{
fn into_inner(self) -> S {
self.source
}
}
impl<K, V, S: Stream<Item = (K, V)>> From<S> for MapStream<K, V, S> {
fn from(source: S) -> Self {
Self { source }
}
}
pub trait EncodeMap<'en> {
type Ok: Stream + Send + Unpin + 'en;
type Error: Error + Send + Unpin + 'en;
fn encode_key<T: IntoStream<'en> + 'en>(&mut self, key: T) -> Result<(), Self::Error>;
fn encode_value<T: IntoStream<'en> + 'en>(&mut self, value: T) -> Result<(), Self::Error>;
fn encode_entry<K: IntoStream<'en> + 'en, V: IntoStream<'en> + 'en>(
&mut self,
key: K,
value: V,
) -> Result<(), Self::Error> {
self.encode_key(key)?;
self.encode_value(value)
}
fn end(self) -> Result<Self::Ok, Self::Error>;
}
pub struct SeqStream<T, S: Stream<Item = T>> {
source: S,
}
impl<'en, T: IntoStream<'en> + 'en, S: Stream<Item = T> + 'en> SeqStream<T, S> {
fn into_inner(self) -> S {
self.source
}
}
impl<T, S: Stream<Item = T>> From<S> for SeqStream<T, S> {
fn from(source: S) -> Self {
Self { source }
}
}
pub trait EncodeSeq<'en> {
type Ok: Stream + Send + Unpin + 'en;
type Error: Error + Send + Unpin + 'en;
fn encode_element<V: IntoStream<'en> + 'en>(&mut self, value: V) -> Result<(), Self::Error>;
fn end(self) -> Result<Self::Ok, Self::Error>;
}
pub trait EncodeTuple<'en> {
type Ok: Stream + Send + Unpin + 'en;
type Error: Error + Send + Unpin + 'en;
fn encode_element<V: IntoStream<'en> + 'en>(&mut self, value: V) -> Result<(), Self::Error>;
fn end(self) -> Result<Self::Ok, Self::Error>;
}
pub trait Encoder<'en>: Sized {
type Ok: Stream + Send + Unpin + 'en;
type Error: Error + Send + Unpin + 'en;
type EncodeMap: EncodeMap<'en, Ok = Self::Ok, Error = Self::Error>;
type EncodeSeq: EncodeSeq<'en, Ok = Self::Ok, Error = Self::Error>;
type EncodeTuple: EncodeTuple<'en, Ok = Self::Ok, Error = Self::Error>;
fn encode_bool(self, v: bool) -> Result<Self::Ok, Self::Error>;
fn encode_i8(self, v: i8) -> Result<Self::Ok, Self::Error>;
fn encode_i16(self, v: i16) -> Result<Self::Ok, Self::Error>;
fn encode_i32(self, v: i32) -> Result<Self::Ok, Self::Error>;
fn encode_i64(self, v: i64) -> Result<Self::Ok, Self::Error>;
fn encode_u8(self, v: u8) -> Result<Self::Ok, Self::Error>;
fn encode_u16(self, v: u16) -> Result<Self::Ok, Self::Error>;
fn encode_u32(self, v: u32) -> Result<Self::Ok, Self::Error>;
fn encode_u64(self, v: u64) -> Result<Self::Ok, Self::Error>;
fn encode_f32(self, v: f32) -> Result<Self::Ok, Self::Error>;
fn encode_f64(self, v: f64) -> Result<Self::Ok, Self::Error>;
fn encode_array_bool<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = bool> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_i8<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = i8> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_i16<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = i16> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_i32<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = i32> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_i64<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = i64> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_u8<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = u8> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_u16<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = u16> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_u32<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = u32> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_u64<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = u64> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_f32<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = f32> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_array_f64<T, S>(self, chunks: S) -> Result<Self::Ok, Self::Error>
where
T: IntoIterator<Item = f64> + Send + Unpin + 'en,
S: Stream<Item = T> + Send + Unpin + 'en,
<T as IntoIterator>::IntoIter: Send + Unpin + 'en;
fn encode_str(self, v: &str) -> Result<Self::Ok, Self::Error>;
fn encode_none(self) -> Result<Self::Ok, Self::Error>;
fn encode_some<T: IntoStream<'en> + 'en>(self, value: T) -> Result<Self::Ok, Self::Error>;
fn encode_unit(self) -> Result<Self::Ok, Self::Error>;
fn encode_bytes<B: Into<Bytes>>(self, bytes: B) -> Result<Self::Ok, Self::Error>;
fn encode_uuid(self, uuid: Uuid) -> Result<Self::Ok, Self::Error>;
fn encode_map(self, len: Option<usize>) -> Result<Self::EncodeMap, Self::Error>;
fn encode_map_stream<K, V, S>(self, map: S) -> Result<Self::Ok, Self::Error>
where
K: IntoStream<'en> + 'en,
V: IntoStream<'en> + 'en,
S: Stream<Item = (K, V)> + Send + Unpin + 'en;
fn encode_seq(self, len: Option<usize>) -> Result<Self::EncodeSeq, Self::Error>;
fn encode_seq_stream<T, S>(self, seq: S) -> Result<Self::Ok, Self::Error>
where
T: IntoStream<'en> + 'en,
S: Stream<Item = T> + Send + Unpin + 'en;
fn encode_tuple(self, len: usize) -> Result<Self::EncodeTuple, Self::Error>;
fn collect_bytes<B: IntoIterator<Item = u8>>(self, bytes: B) -> Result<Self::Ok, Self::Error>;
fn collect_seq<T, I>(self, iter: I) -> Result<Self::Ok, Self::Error>
where
T: IntoStream<'en> + 'en,
I: IntoIterator<Item = T>,
{
let iter = iter.into_iter();
let mut encoder = self.encode_seq(iterator_len_hint(&iter))?;
for item in iter {
encoder.encode_element(item)?;
}
encoder.end()
}
fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error>
where
K: IntoStream<'en> + 'en,
V: IntoStream<'en> + 'en,
I: IntoIterator<Item = (K, V)>,
{
let iter = iter.into_iter();
let mut encoder = self.encode_map(iterator_len_hint(&iter))?;
for (key, value) in iter {
encoder.encode_entry(key, value)?;
}
encoder.end()
}
fn collect_str<T: fmt::Display + ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> {
self.encode_str(&value.to_string())
}
}
pub trait ToStream<'en> {
fn to_stream<E: Encoder<'en>>(&'en self, encoder: E) -> Result<E::Ok, E::Error>;
}
pub trait IntoStream<'en> {
fn into_stream<E: Encoder<'en>>(self, encoder: E) -> Result<E::Ok, E::Error>;
}
fn iterator_len_hint<I>(iter: &I) -> Option<usize>
where
I: Iterator,
{
match iter.size_hint() {
(lo, Some(hi)) if lo == hi => Some(lo),
_ => None,
}
}