use bytes::Bytes;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum FrontendMessage {
Startup {
version: i32,
params: Vec<(String, String)>,
},
Password(String),
Query(String),
Terminate,
SaslInitialResponse {
mechanism: String,
data: Vec<u8>,
},
SaslResponse {
data: Vec<u8>,
},
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum BackendMessage {
Authentication(AuthenticationMessage),
BackendKeyData {
process_id: i32,
secret_key: i32,
},
CommandComplete(String),
DataRow(Vec<Option<Bytes>>),
ErrorResponse(ErrorFields),
NoticeResponse(ErrorFields),
ParameterStatus {
name: String,
value: String,
},
ReadyForQuery {
status: u8,
},
RowDescription(Vec<FieldDescription>),
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum AuthenticationMessage {
Ok,
CleartextPassword,
Md5Password {
salt: [u8; 4],
},
Sasl {
mechanisms: Vec<String>,
},
SaslContinue {
data: Vec<u8>,
},
SaslFinal {
data: Vec<u8>,
},
}
#[derive(Debug, Clone)]
pub struct FieldDescription {
pub name: String,
pub table_oid: i32,
pub column_attr: i16,
pub type_oid: u32,
pub type_size: i16,
pub type_modifier: i32,
pub format_code: i16,
}
#[derive(Debug, Clone, Default)]
pub struct ErrorFields {
pub severity: Option<String>,
pub code: Option<String>,
pub message: Option<String>,
pub detail: Option<String>,
pub hint: Option<String>,
pub position: Option<String>,
}
impl std::fmt::Display for ErrorFields {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(ref msg) = self.message {
write!(f, "{}", msg)?;
}
if let Some(ref code) = self.code {
write!(f, " ({})", code)?;
}
Ok(())
}
}