sqlx_core_guts/postgres/message/
mod.rs

1use 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;
40pub use flush::Flush;
41pub use notification::Notification;
42pub use parameter_description::ParameterDescription;
43pub use parameter_status::ParameterStatus;
44pub use parse::Parse;
45pub use password::Password;
46pub use query::Query;
47pub use ready_for_query::{ReadyForQuery, TransactionStatus};
48pub use response::{Notice, PgSeverity};
49pub use row_description::RowDescription;
50pub use sasl::{SaslInitialResponse, SaslResponse};
51pub use ssl_request::SslRequest;
52pub use startup::Startup;
53pub use sync::Sync;
54pub use terminate::Terminate;
55
56#[derive(Debug, PartialOrd, PartialEq)]
57#[repr(u8)]
58pub enum MessageFormat {
59    Authentication,
60    BackendKeyData,
61    BindComplete,
62    CloseComplete,
63    CommandComplete,
64    CopyData,
65    CopyDone,
66    CopyInResponse,
67    CopyOutResponse,
68    DataRow,
69    EmptyQueryResponse,
70    ErrorResponse,
71    NoData,
72    NoticeResponse,
73    NotificationResponse,
74    ParameterDescription,
75    ParameterStatus,
76    ParseComplete,
77    PortalSuspended,
78    ReadyForQuery,
79    RowDescription,
80}
81
82#[derive(Debug)]
83pub struct Message {
84    pub format: MessageFormat,
85    pub contents: Bytes,
86}
87
88impl Message {
89    #[inline]
90    pub fn decode<'de, T>(self) -> Result<T, Error>
91    where
92        T: Decode<'de>,
93    {
94        T::decode(self.contents)
95    }
96}
97
98impl MessageFormat {
99    pub fn try_from_u8(v: u8) -> Result<Self, Error> {
100        // https://www.postgresql.org/docs/current/protocol-message-formats.html
101
102        Ok(match v {
103            b'1' => MessageFormat::ParseComplete,
104            b'2' => MessageFormat::BindComplete,
105            b'3' => MessageFormat::CloseComplete,
106            b'C' => MessageFormat::CommandComplete,
107            b'd' => MessageFormat::CopyData,
108            b'c' => MessageFormat::CopyDone,
109            b'G' => MessageFormat::CopyInResponse,
110            b'H' => MessageFormat::CopyOutResponse,
111            b'D' => MessageFormat::DataRow,
112            b'E' => MessageFormat::ErrorResponse,
113            b'I' => MessageFormat::EmptyQueryResponse,
114            b'A' => MessageFormat::NotificationResponse,
115            b'K' => MessageFormat::BackendKeyData,
116            b'N' => MessageFormat::NoticeResponse,
117            b'R' => MessageFormat::Authentication,
118            b'S' => MessageFormat::ParameterStatus,
119            b'T' => MessageFormat::RowDescription,
120            b'Z' => MessageFormat::ReadyForQuery,
121            b'n' => MessageFormat::NoData,
122            b's' => MessageFormat::PortalSuspended,
123            b't' => MessageFormat::ParameterDescription,
124
125            _ => return Err(err_protocol!("unknown message type: {:?}", v as char)),
126        })
127    }
128}