lazy_template/template/
std_extensions.rs

1#![cfg(feature = "std")]
2use super::{Template, TemplateApplicationError};
3use crate::Render;
4use core::fmt;
5use pipe_trait::Pipe;
6use std::io;
7
8impl<SegmentResultIntoIter, Query> Template<SegmentResultIntoIter, Query>
9where
10    SegmentResultIntoIter: IntoIterator,
11{
12    /// Apply the template, and join the resulting segment outputs together into a [`String`].
13    pub fn to_string<Segment, ParseError, RenderOutput, QueryOutput, QueryError, Respond>(
14        self,
15        respond: Respond,
16    ) -> Result<String, TemplateApplicationError<ParseError, QueryError, fmt::Error>>
17    where
18        SegmentResultIntoIter::Item: Into<Result<Segment, ParseError>>,
19        RenderOutput: fmt::Display,
20        Segment: Render<Respond, RenderOutput, QueryError>,
21        Respond: FnMut(Query) -> Result<QueryOutput, QueryError>,
22    {
23        let mut buf = String::new();
24        self.write_to(&mut buf, respond)?;
25        Ok(buf)
26    }
27
28    /// Apply the template, and write the resulting segment outputs that implement [`fmt::Display`] to a
29    /// writer that implements [`io::Write`].
30    pub fn to_writer<Writer, Segment, ParseError, RenderOutput, QueryOutput, QueryError, Respond>(
31        self,
32        writer: &mut Writer,
33        respond: Respond,
34    ) -> Result<(), TemplateApplicationError<ParseError, QueryError, io::Error>>
35    where
36        Writer: io::Write,
37        SegmentResultIntoIter::Item: Into<Result<Segment, ParseError>>,
38        RenderOutput: fmt::Display,
39        Segment: Render<Respond, RenderOutput, QueryError>,
40        Respond: FnMut(Query) -> Result<QueryOutput, QueryError>,
41    {
42        let mut write_error = None;
43
44        self.apply(respond, |response| {
45            write_error = write!(writer, "{response}").err()
46        })
47        .map_err(|error| match error {
48            TemplateApplicationError::Parse(error) => TemplateApplicationError::Parse(error),
49            TemplateApplicationError::Query(error) => TemplateApplicationError::Query(error),
50            TemplateApplicationError::Write(error) => match error {},
51        })?;
52
53        if let Some(error) = write_error {
54            return error.pipe(TemplateApplicationError::Write).pipe(Err);
55        }
56
57        Ok(())
58    }
59}