Skip to content

Commit 0a0bc5d

Browse files
committed
Add a frontend enum
This can be a bit more convenient to work with in some situations
1 parent a1fc594 commit 0a0bc5d

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

src/message/frontend.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,109 @@ use std::marker;
88

99
use {Oid, FromUsize, IsNull, write_nullable};
1010

11+
pub enum Message<'a> {
12+
Bind {
13+
portal: &'a str,
14+
statement: &'a str,
15+
formats: &'a [i16],
16+
values: &'a [Option<Vec<u8>>],
17+
result_formats: &'a [i16],
18+
},
19+
CancelRequest {
20+
process_id: i32,
21+
secret_key: i32,
22+
},
23+
Close {
24+
variant: u8,
25+
name: &'a str,
26+
},
27+
CopyData {
28+
data: &'a [u8],
29+
},
30+
CopyDone,
31+
CopyFail {
32+
message: &'a str,
33+
},
34+
Describe {
35+
variant: u8,
36+
name: &'a str,
37+
},
38+
Execute {
39+
portal: &'a str,
40+
max_rows: i32,
41+
},
42+
Parse {
43+
name: &'a str,
44+
query: &'a str,
45+
param_types: &'a [Oid],
46+
},
47+
PasswordMessage {
48+
password: &'a str,
49+
},
50+
Query {
51+
query: &'a str,
52+
},
53+
SslRequest,
54+
StartupMessage {
55+
parameters: &'a [(String, String)],
56+
},
57+
Sync,
58+
Terminate,
59+
#[doc(hidden)]
60+
__ForExtensibility,
61+
}
62+
63+
impl<'a> Message<'a> {
64+
#[inline]
65+
pub fn serialize(&self, buf: &mut Vec<u8>) -> io::Result<()> {
66+
match *self {
67+
Message::Bind { portal, statement, formats, values, result_formats } => {
68+
let r = bind(portal,
69+
statement,
70+
formats.iter().cloned(),
71+
values,
72+
|v, buf| {
73+
match *v {
74+
Some(ref v) => {
75+
buf.extend_from_slice(v);
76+
Ok(IsNull::No)
77+
}
78+
None => Ok(IsNull::Yes),
79+
}
80+
},
81+
result_formats.iter().cloned(),
82+
buf);
83+
match r {
84+
Ok(()) => Ok(()),
85+
Err(BindError::Conversion(_)) => unreachable!(),
86+
Err(BindError::Serialization(e)) => Err(e),
87+
}
88+
}
89+
Message::CancelRequest { process_id, secret_key } => {
90+
Ok(cancel_request(process_id, secret_key, buf))
91+
}
92+
Message::Close { variant, name } => close(variant, name, buf),
93+
Message::CopyData { data } => copy_data(data, buf),
94+
Message::CopyDone => Ok(copy_done(buf)),
95+
Message::CopyFail { message } => copy_fail(message, buf),
96+
Message::Describe { variant, name } => describe(variant, name, buf),
97+
Message::Execute { portal, max_rows } => execute(portal, max_rows, buf),
98+
Message::Parse { name, query, param_types } => {
99+
parse(name, query, param_types.iter().cloned(), buf)
100+
}
101+
Message::PasswordMessage { password } => password_message(password, buf),
102+
Message::Query { query: q } => query(q, buf),
103+
Message::SslRequest => Ok(ssl_request(buf)),
104+
Message::StartupMessage { parameters } => {
105+
startup_message(parameters.iter().map(|&(ref k, ref v)| (&**k, &**v)), buf)
106+
}
107+
Message::Sync => Ok(sync(buf)),
108+
Message::Terminate => Ok(terminate(buf)),
109+
Message::__ForExtensibility => unreachable!(),
110+
}
111+
}
112+
}
113+
11114
#[inline]
12115
fn write_body<F, E>(buf: &mut Vec<u8>, f: F) -> Result<(), E>
13116
where F: FnOnce(&mut Vec<u8>) -> Result<(), E>,

0 commit comments

Comments
 (0)