zero_postgres/protocol/backend/
error.rs1use std::collections::HashMap;
4
5use crate::error::{Error, Result, ServerError};
6use crate::protocol::codec::read_cstr;
7
8fn parse_fields(payload: &[u8]) -> Result<ServerError> {
10 let mut fields = HashMap::new();
11 let mut data = payload;
12
13 while !data.is_empty() && data[0] != 0 {
14 let field_type = data[0];
15 data = &data[1..];
16
17 let (value, rest) = read_cstr(data)?;
18 data = rest;
19
20 fields.insert(field_type, value.to_string());
21 }
22
23 Ok(ServerError::new(fields))
24}
25
26#[derive(Debug, Clone)]
28pub struct ErrorResponse(pub ServerError);
29
30impl ErrorResponse {
31 pub fn parse(payload: &[u8]) -> Result<Self> {
33 Ok(Self(parse_fields(payload)?))
34 }
35
36 pub fn into_error(self) -> Error {
38 Error::Server(self.0)
39 }
40
41 pub fn error(&self) -> &ServerError {
43 &self.0
44 }
45}
46
47#[derive(Debug, Clone)]
49pub struct NoticeResponse(pub ServerError);
50
51impl NoticeResponse {
52 pub fn parse(payload: &[u8]) -> Result<Self> {
54 Ok(Self(parse_fields(payload)?))
55 }
56
57 pub fn error(&self) -> &ServerError {
59 &self.0
60 }
61}