1use super::{Output, SequenceAccept, Writable, WritableSeq};
27
28pub struct NoOp;
30
31impl<O> Writable<O> for NoOp
32where
33 O: Output,
34{
35 async fn write_to(&self, _: &mut O) -> Result<(), O::Error> {
36 Ok(())
37 }
38}
39
40pub struct NoOpSeq;
42
43impl<O> WritableSeq<O> for NoOpSeq
44where
45 O: Output,
46{
47 async fn for_each<S: SequenceAccept<O>>(&self, _: &mut S) -> Result<(), O::Error> {
48 Ok(())
49 }
50}
51
52pub struct Combined<W1, W2>(pub W1, pub W2);
54
55impl<O, W1, W2> Writable<O> for Combined<W1, W2>
56where
57 O: Output,
58 W1: Writable<O>,
59 W2: Writable<O>,
60{
61 async fn write_to(&self, output: &mut O) -> Result<(), O::Error> {
62 self.0.write_to(output).await?;
63 self.1.write_to(output).await
64 }
65}
66
67pub struct CombinedSeq<S1, S2>(pub S1, pub S2);
69
70impl<O, S1, S2> WritableSeq<O> for CombinedSeq<S1, S2>
71where
72 O: Output,
73 S1: WritableSeq<O>,
74 S2: WritableSeq<O>,
75{
76 async fn for_each<S>(&self, sink: &mut S) -> Result<(), O::Error>
77 where
78 S: SequenceAccept<O>,
79 {
80 self.0.for_each(sink).await?;
81 self.1.for_each(sink).await
82 }
83}
84
85pub struct SingularSeq<W>(pub W);
88
89impl<O, W> WritableSeq<O> for SingularSeq<W>
90where
91 O: Output,
92 W: Writable<O>,
93{
94 async fn for_each<S>(&self, sink: &mut S) -> Result<(), O::Error>
95 where
96 S: SequenceAccept<O>,
97 {
98 sink.accept(&self.0).await
99 }
100}
101
102pub struct RepeatSeq<W> {
105 pub count: usize,
107 pub writable: W,
109}
110
111impl<O, W> WritableSeq<O> for RepeatSeq<W>
112where
113 O: Output,
114 W: Writable<O>,
115{
116 async fn for_each<S>(&self, sink: &mut S) -> Result<(), O::Error>
117 where
118 S: SequenceAccept<O>,
119 {
120 for _ in 0..self.count {
121 sink.accept(&self.writable).await?;
122 }
123 Ok(())
124 }
125}
126
127pub struct ArrSeq<'a, W>(pub &'a [W]);
129
130impl<O, W> WritableSeq<O> for ArrSeq<'_, W>
131where
132 O: Output,
133 W: Writable<O>,
134{
135 async fn for_each<S>(&self, sink: &mut S) -> Result<(), O::Error>
136 where
137 S: SequenceAccept<O>,
138 {
139 for elem in self.0 {
140 sink.accept(elem).await?;
141 }
142 Ok(())
143 }
144}
145
146#[derive(Copy, Clone, Debug)]
149pub struct Str<STR>(pub STR);
150
151impl<O, STR> Writable<O> for Str<STR>
152where
153 O: Output,
154 STR: AsRef<str>,
155{
156 async fn write_to(&self, output: &mut O) -> Result<(), O::Error> {
157 output.write(self.0.as_ref()).await
158 }
159}
160
161pub struct StrArrSeq<'a>(pub &'a [&'a str]);
163
164impl<O> WritableSeq<O> for StrArrSeq<'_>
165where
166 O: Output,
167{
168 async fn for_each<S>(&self, sink: &mut S) -> Result<(), O::Error>
169 where
170 S: SequenceAccept<O>,
171 {
172 for elem in self.0 {
173 sink.accept(&Str(*elem)).await?;
174 }
175 Ok(())
176 }
177}
178
179pub struct SeparatedSeqAccept<'o, O, Intro, Sep> {
182 pub output: &'o mut O,
184 pub intro: Intro,
186 pub separator: Sep,
188 pub wrote_any: bool,
190}
191
192impl<'o, O, Intro, Sep> SeparatedSeqAccept<'o, O, Intro, Sep> {
193 pub fn new(output: &'o mut O, intro: Intro, separator: Sep) -> Self {
194 Self {
195 output,
196 intro,
197 separator,
198 wrote_any: false,
199 }
200 }
201}
202
203impl<'o, O, Sep> SeparatedSeqAccept<'o, O, NoOp, Sep> {
204 pub fn no_intro(output: &'o mut O, separator: Sep) -> Self {
205 Self::new(output, NoOp, separator)
206 }
207}
208
209impl<'o, O> SeparatedSeqAccept<'o, O, NoOp, Str<&'static str>> {
210 pub fn comma_separated(output: &'o mut O) -> Self {
212 Self::new(output, NoOp, Str(", "))
213 }
214}
215
216impl<'o, O, Intro, Sep> SequenceAccept<O> for SeparatedSeqAccept<'o, O, Intro, Sep>
217where
218 O: Output,
219 Intro: Writable<O>,
220 Sep: Writable<O>,
221{
222 async fn accept<W>(&mut self, writable: &W) -> Result<(), O::Error>
223 where
224 W: Writable<O>,
225 {
226 if self.wrote_any {
227 self.separator.write_to(self.output).await?;
228 } else {
229 self.intro.write_to(self.output).await?;
230 self.wrote_any = true;
231 }
232 writable.write_to(self.output).await
233 }
234}
235
236pub struct SequenceViaConfig<'t, T, Config> {
239 pub data: &'t [T],
240 pub config: Config,
241}
242
243pub trait SequenceConfig<T, O>
245where
246 O: Output,
247{
248 async fn write_datum(&self, datum: &T, output: &mut O) -> Result<(), O::Error>;
250}
251
252impl<'t, T, Config, O> WritableSeq<O> for SequenceViaConfig<'t, T, Config>
253where
254 O: Output,
255 Config: SequenceConfig<T, O>,
256{
257 async fn for_each<S>(&self, sink: &mut S) -> Result<(), O::Error>
258 where
259 S: SequenceAccept<O>,
260 {
261 struct WriteSingle<'t, T, Config> {
262 datum: &'t T,
263 config: &'t Config,
264 }
265 impl<'t, T, Config, O> Writable<O> for WriteSingle<'t, T, Config>
266 where
267 O: Output,
268 Config: SequenceConfig<T, O>,
269 {
270 async fn write_to(&self, output: &mut O) -> Result<(), O::Error> {
271 self.config.write_datum(self.datum, output).await
272 }
273 }
274 for datum in self.data {
275 sink.accept(&WriteSingle {
276 datum,
277 config: &self.config,
278 })
279 .await?;
280 }
281 Ok(())
282 }
283}
284
285pub struct ExtractWritable<F>(pub F);
288
289impl<F, T, W, O> SequenceConfig<T, O> for ExtractWritable<F>
290where
291 O: Output,
292 for<'t> F: Fn(&'t T) -> W,
293 W: Writable<O>,
294{
295 async fn write_datum(&self, datum: &T, output: &mut O) -> Result<(), O::Error> {
296 let writable = (&self.0)(datum);
297 writable.write_to(output).await
298 }
299}