async_serialization/
lib.rs1#![deny(missing_docs)]
5
6#![deprecated="This was a failed attempt at finding a suitable abstraction. The async-codec crate might be what you need instead."]
7
8extern crate futures_core;
9extern crate futures_io;
10
11use std::error::Error;
12use std::fmt::{self, Display, Formatter};
13
14use futures_core::Future;
15use futures_io::{AsyncRead, AsyncWrite, Error as FutIoErr};
16
17pub trait AsyncWriterFuture<W: AsyncWrite>
22 : Future<Item = (W, usize), Error = (W, FutIoErr)> {
23 fn already_written(&self) -> usize;
25}
26
27pub trait AsyncWriterFutureLen<W: AsyncWrite>: AsyncWriterFuture<W> {
30 fn remaining_bytes(&self) -> usize;
32}
33
34pub trait AsyncSerialize<W: AsyncWrite>: AsyncWriterFuture<W> {
37 type Serialized;
39
40 fn from_val(writer: W, val: Self::Serialized) -> Self;
43}
44
45pub trait AsyncSerializeLen<W: AsyncWrite>
47 : AsyncSerialize<W> + AsyncWriterFutureLen<W> {
48 fn total_bytes(val: &Self::Serialized) -> usize;
51}
52
53pub trait AsyncSerializeRef<'val, W: AsyncWrite>: AsyncWriterFuture<W> {
55 type Serialized;
57
58 fn from_ref(writer: W, val: &'val Self::Serialized) -> Self;
61}
62
63pub trait AsyncSerializeRefLen<'val, W: AsyncWrite>
65 : AsyncSerializeRef<'val, W> + AsyncWriterFutureLen<W> {
66 fn total_bytes(val: &Self::Serialized) -> usize;
69}
70
71pub trait AsyncDeserialize<R: AsyncRead, S, E>
74 : Future<Item = (R, S, usize), Error = (R, DeserializeError<E>)> {
75 fn from_reader(reader: R) -> Self;
77
78 fn already_read(&self) -> usize;
80}
81
82#[derive(Debug)]
84pub enum DeserializeError<E> {
85 ReaderError(FutIoErr),
87 DataError(E),
89}
90
91impl<E: Display> Display for DeserializeError<E> {
92 fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
93 match *self {
94 DeserializeError::ReaderError(ref err) => {
95 write!(f, "Deserialize reader error: {}", err)
96 }
97 DeserializeError::DataError(ref err) => write!(f, "Deserialize data error: {}", err),
98 }
99 }
100}
101
102impl<E: Error> Error for DeserializeError<E> {
103 fn description(&self) -> &str {
104 match *self {
105 DeserializeError::ReaderError(ref err) => err.description(),
106 DeserializeError::DataError(ref err) => err.description(),
107 }
108 }
109
110 fn cause(&self) -> Option<&Error> {
111 match *self {
112 DeserializeError::ReaderError(ref err) => Some(err),
113 DeserializeError::DataError(ref err) => Some(err),
114 }
115 }
116}
117
118impl<E> From<FutIoErr> for DeserializeError<E> {
119 fn from(err: FutIoErr) -> DeserializeError<E> {
120 DeserializeError::ReaderError(err)
121 }
122}