diny_core/backend/
encode.rs1use core::task::{Context, Poll};
2use crate::backend::{Format, FormatEncode};
3use crate::io;
4
5
6pub enum StartEncodeStatus<Enc, Err> {
12 Fini,
13 Pending(Enc),
14 Error(Err),
15}
16
17impl<Enc, Err> StartEncodeStatus<Enc, Err> {
18 #[inline(always)]
19 pub fn map_pending<F, E>(self, f: F) -> StartEncodeStatus<E, Err>
20 where
21 F: FnOnce(Enc) -> E,
22 {
23 match self {
24 Self::Fini => StartEncodeStatus::Fini,
25 Self::Pending(enc) => StartEncodeStatus::Pending(f(enc)),
26 Self::Error(e) => StartEncodeStatus::Error(e),
27 }
28 }
29}
30
31pub enum PollEncodeStatus<Err> {
35 Fini,
36 Pending,
37 Error(Err),
38}
39
40impl<Err> PollEncodeStatus<Err> {
41 #[inline(always)]
42 pub fn lift<Enc>(self, enc: Enc) -> StartEncodeStatus<Enc, Err> {
43 match self {
44 PollEncodeStatus::Fini => StartEncodeStatus::Fini,
45 PollEncodeStatus::Pending => StartEncodeStatus::Pending(enc),
46 PollEncodeStatus::Error(err) => StartEncodeStatus::Error(err),
47 }
48 }
49
50 #[inline(always)]
51 pub fn map_err<F, E>(self, f: F) -> PollEncodeStatus<E>
52 where
53 F: FnOnce(Err) -> E,
54 {
55 match self {
56 PollEncodeStatus::Fini => PollEncodeStatus::Fini,
57 PollEncodeStatus::Pending => PollEncodeStatus::Pending,
58 PollEncodeStatus::Error(err) => PollEncodeStatus::Error(f(err))
59 }
60 }
61}
62
63impl<Err> From<PollEncodeStatus<Err>> for Poll<Result<(), Err>> {
64 #[inline(always)]
65 fn from(status: PollEncodeStatus<Err>) -> Self {
66 match status {
67 PollEncodeStatus::Fini => Poll::Ready(Ok(())),
68 PollEncodeStatus::Pending => Poll::Pending,
69 PollEncodeStatus::Error(e) => Poll::Ready(Err(e)),
70 }
71 }
72}
73
74pub trait Encode: Sized {
77 type Format: FormatEncode;
79
80 type Data: ?Sized;
82
83 fn init(data: &Self::Data) -> Self;
85
86 fn start_encode<W>(format: &Self::Format, writer: &mut W, data: &Self::Data, cx: &mut Context<'_>) -> StartEncodeStatus<Self, <<Self as Encode>::Format as Format>::Error>
95 where
96 W: io::AsyncWrite + Unpin,
97 {
98 let mut enc = Self::init(data);
99 enc.poll_encode(format, writer, data, cx)
100 .lift(enc)
101 }
102
103 fn poll_encode<W>(&mut self, format: &Self::Format, writer: &mut W, data: &Self::Data, cx: &mut Context<'_>) -> PollEncodeStatus<<<Self as Encode>::Format as Format>::Error>
105 where
106 W: io::AsyncWrite + Unpin,
107 ;
108}
109
110
111
112
113