zero_postgres/
statement.rs

1//! Statement reference types for polymorphic exec_* methods.
2
3use crate::state::extended::PreparedStatement;
4
5/// Sealed trait for types that can be used as statement references in exec_* methods.
6///
7/// This trait is sealed and cannot be implemented outside this crate.
8pub trait IntoStatement: private::Sealed {
9    /// Returns true if this is raw SQL (needs Parse message).
10    fn needs_parse(&self) -> bool;
11
12    /// Get the SQL string if this is raw SQL.
13    fn as_sql(&self) -> Option<&str>;
14
15    /// Get the prepared statement if this is a prepared statement reference.
16    fn as_prepared(&self) -> Option<&PreparedStatement>;
17}
18
19mod private {
20    use crate::state::extended::PreparedStatement;
21
22    pub trait Sealed {}
23
24    impl Sealed for PreparedStatement {}
25    impl Sealed for &PreparedStatement {}
26    impl Sealed for str {}
27    impl Sealed for &str {}
28    impl Sealed for &&str {}
29}
30
31impl IntoStatement for &PreparedStatement {
32    fn needs_parse(&self) -> bool {
33        false
34    }
35
36    fn as_sql(&self) -> Option<&str> {
37        None
38    }
39
40    fn as_prepared(&self) -> Option<&PreparedStatement> {
41        Some(self)
42    }
43}
44
45impl IntoStatement for &str {
46    fn needs_parse(&self) -> bool {
47        true
48    }
49
50    fn as_sql(&self) -> Option<&str> {
51        Some(self)
52    }
53
54    fn as_prepared(&self) -> Option<&PreparedStatement> {
55        None
56    }
57}
58
59impl IntoStatement for &&str {
60    fn needs_parse(&self) -> bool {
61        true
62    }
63
64    fn as_sql(&self) -> Option<&str> {
65        Some(self)
66    }
67
68    fn as_prepared(&self) -> Option<&PreparedStatement> {
69        None
70    }
71}
72
73impl IntoStatement for str {
74    fn needs_parse(&self) -> bool {
75        true
76    }
77
78    fn as_sql(&self) -> Option<&str> {
79        Some(self)
80    }
81
82    fn as_prepared(&self) -> Option<&PreparedStatement> {
83        None
84    }
85}
86
87impl IntoStatement for PreparedStatement {
88    fn needs_parse(&self) -> bool {
89        false
90    }
91
92    fn as_sql(&self) -> Option<&str> {
93        None
94    }
95
96    fn as_prepared(&self) -> Option<&PreparedStatement> {
97        Some(self)
98    }
99}