sqlx_etorreborre_postgres/message/
mod.rs

1use sqlx_core::bytes::Bytes;
2
3use crate::error::Error;
4use crate::io::Decode;
5
6mod authentication;
7mod backend_key_data;
8mod bind;
9mod close;
10mod command_complete;
11mod copy;
12mod data_row;
13mod describe;
14mod execute;
15mod flush;
16mod notification;
17mod parameter_description;
18mod parameter_status;
19mod parse;
20mod password;
21mod query;
22mod ready_for_query;
23mod response;
24mod row_description;
25mod sasl;
26mod ssl_request;
27mod startup;
28mod sync;
29mod terminate;
30
31pub use authentication::{Authentication, AuthenticationSasl};
32pub use backend_key_data::BackendKeyData;
33pub use bind::Bind;
34pub use close::Close;
35pub use command_complete::CommandComplete;
36pub use copy::{CopyData, CopyDone, CopyFail, CopyResponse};
37pub use data_row::DataRow;
38pub use describe::Describe;
39pub use execute::Execute;
40#[allow(unused_imports)]
41pub use flush::Flush;
42pub use notification::Notification;
43pub use parameter_description::ParameterDescription;
44pub use parameter_status::ParameterStatus;
45pub use parse::Parse;
46pub use password::Password;
47pub use query::Query;
48pub use ready_for_query::{ReadyForQuery, TransactionStatus};
49pub use response::{Notice, PgSeverity};
50pub use row_description::RowDescription;
51pub use sasl::{SaslInitialResponse, SaslResponse};
52pub use ssl_request::SslRequest;
53pub use startup::Startup;
54pub use sync::Sync;
55pub use terminate::Terminate;
56
57#[derive(Debug, PartialOrd, PartialEq)]
58#[repr(u8)]
59pub enum MessageFormat {
60    Authentication,
61    BackendKeyData,
62    BindComplete,
63    CloseComplete,
64    CommandComplete,
65    CopyData,
66    CopyDone,
67    CopyInResponse,
68    CopyOutResponse,
69    DataRow,
70    EmptyQueryResponse,
71    ErrorResponse,
72    NoData,
73    NoticeResponse,
74    NotificationResponse,
75    ParameterDescription,
76    ParameterStatus,
77    ParseComplete,
78    PortalSuspended,
79    ReadyForQuery,
80    RowDescription,
81}
82
83#[derive(Debug)]
84pub struct Message {
85    pub format: MessageFormat,
86    pub contents: Bytes,
87}
88
89impl Message {
90    #[inline]
91    pub fn decode<'de, T>(self) -> Result<T, Error>
92    where
93        T: Decode<'de>,
94    {
95        T::decode(self.contents)
96    }
97}
98
99impl MessageFormat {
100    pub fn try_from_u8(v: u8) -> Result<Self, Error> {
101        // https://www.postgresql.org/docs/current/protocol-message-formats.html
102
103        Ok(match v {
104            b'1' => MessageFormat::ParseComplete,
105            b'2' => MessageFormat::BindComplete,
106            b'3' => MessageFormat::CloseComplete,
107            b'C' => MessageFormat::CommandComplete,
108            b'd' => MessageFormat::CopyData,
109            b'c' => MessageFormat::CopyDone,
110            b'G' => MessageFormat::CopyInResponse,
111            b'H' => MessageFormat::CopyOutResponse,
112            b'D' => MessageFormat::DataRow,
113            b'E' => MessageFormat::ErrorResponse,
114            b'I' => MessageFormat::EmptyQueryResponse,
115            b'A' => MessageFormat::NotificationResponse,
116            b'K' => MessageFormat::BackendKeyData,
117            b'N' => MessageFormat::NoticeResponse,
118            b'R' => MessageFormat::Authentication,
119            b'S' => MessageFormat::ParameterStatus,
120            b'T' => MessageFormat::RowDescription,
121            b'Z' => MessageFormat::ReadyForQuery,
122            b'n' => MessageFormat::NoData,
123            b's' => MessageFormat::PortalSuspended,
124            b't' => MessageFormat::ParameterDescription,
125
126            _ => return Err(err_protocol!("unknown message type: {:?}", v as char)),
127        })
128    }
129}