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 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}