xxai_tokio_postgres/
to_statement.rs

1use crate::to_statement::private::{Sealed, ToStatementType};
2use crate::Statement;
3
4pub(crate) mod private {
5    use crate::{Client, Error, Statement};
6
7    pub trait Sealed {}
8
9    /// enum Statement or Query
10    pub enum ToStatementType<'a> {
11        /// statements
12        Statement(&'a Statement),
13        /// query
14        Query(&'a str),
15    }
16
17    impl<'a> ToStatementType<'a> {
18        /// into_statement
19        pub async fn into_statement(self, client: &Client) -> Result<Statement, Error> {
20            match self {
21                ToStatementType::Statement(s) => Ok(s.clone()),
22                ToStatementType::Query(s) => client.prepare(s).await,
23            }
24        }
25    }
26}
27
28/// A trait abstracting over prepared and unprepared statements.
29///
30/// Many methods are generic over this bound, so that they support both a raw query string as well as a statement which
31/// was prepared previously.
32///
33/// This trait is "sealed" and cannot be implemented by anything outside this crate.
34pub trait ToStatement {
35    /// A trait abstracting over prepared and unprepared statements.
36    fn __convert(&self) -> ToStatementType<'_>;
37}
38
39impl ToStatement for Statement {
40    fn __convert(&self) -> ToStatementType<'_> {
41        ToStatementType::Statement(self)
42    }
43}
44
45impl Sealed for Statement {}
46
47impl<T: AsRef<str>> ToStatement for T {
48    fn __convert(&self) -> ToStatementType<'_> {
49        ToStatementType::Query(self.as_ref())
50    }
51}
52
53impl Sealed for str {}
54
55impl Sealed for String {}