sqlx_core_guts/postgres/message/
mod.rs1use 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 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}