Skip to main content

rbdc_pg/message/
mod.rs

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