cassandra_protocol/frame/
message_request.rs1use std::io::Cursor;
2
3use crate::frame::message_auth_response::BodyReqAuthResponse;
4use crate::frame::message_batch::BodyReqBatch;
5use crate::frame::message_execute::BodyReqExecuteOwned;
6use crate::frame::message_options::BodyReqOptions;
7use crate::frame::message_prepare::BodyReqPrepare;
8use crate::frame::message_query::BodyReqQuery;
9use crate::frame::message_register::BodyReqRegister;
10use crate::frame::message_startup::BodyReqStartup;
11use crate::frame::{FromCursor, Opcode, Serialize, Version};
12use crate::{error, Error};
13
14#[derive(Debug, PartialEq, Eq, Clone)]
15#[allow(clippy::large_enum_variant)]
16#[non_exhaustive]
17pub enum RequestBody {
18 Startup(BodyReqStartup),
19 Options(BodyReqOptions),
20 Query(BodyReqQuery),
21 Prepare(BodyReqPrepare),
22 Execute(BodyReqExecuteOwned),
23 Register(BodyReqRegister),
24 Batch(BodyReqBatch),
25 AuthResponse(BodyReqAuthResponse),
26}
27
28impl Serialize for RequestBody {
29 fn serialize(&self, cursor: &mut Cursor<&mut Vec<u8>>, version: Version) {
30 match self {
31 RequestBody::Query(body) => body.serialize(cursor, version),
32 RequestBody::Startup(body) => body.serialize(cursor, version),
33 RequestBody::Options(body) => body.serialize(cursor, version),
34 RequestBody::Prepare(body) => body.serialize(cursor, version),
35 RequestBody::Execute(body) => body.serialize(cursor, version),
36 RequestBody::Register(body) => body.serialize(cursor, version),
37 RequestBody::Batch(body) => body.serialize(cursor, version),
38 RequestBody::AuthResponse(body) => body.serialize(cursor, version),
39 }
40 }
41}
42
43impl RequestBody {
44 pub fn try_from(
45 bytes: &[u8],
46 response_type: Opcode,
47 version: Version,
48 ) -> error::Result<RequestBody> {
49 let mut cursor: Cursor<&[u8]> = Cursor::new(bytes);
50 match response_type {
51 Opcode::Startup => {
52 BodyReqStartup::from_cursor(&mut cursor, version).map(RequestBody::Startup)
53 }
54 Opcode::Options => {
55 BodyReqOptions::from_cursor(&mut cursor, version).map(RequestBody::Options)
56 }
57 Opcode::Query => {
58 BodyReqQuery::from_cursor(&mut cursor, version).map(RequestBody::Query)
59 }
60 Opcode::Prepare => {
61 BodyReqPrepare::from_cursor(&mut cursor, version).map(RequestBody::Prepare)
62 }
63 Opcode::Execute => {
64 BodyReqExecuteOwned::from_cursor(&mut cursor, version).map(RequestBody::Execute)
65 }
66 Opcode::Register => {
67 BodyReqRegister::from_cursor(&mut cursor, version).map(RequestBody::Register)
68 }
69 Opcode::Batch => {
70 BodyReqBatch::from_cursor(&mut cursor, version).map(RequestBody::Batch)
71 }
72 Opcode::AuthResponse => BodyReqAuthResponse::from_cursor(&mut cursor, version)
73 .map(RequestBody::AuthResponse),
74 _ => Err(Error::NonRequestOpcode(response_type)),
75 }
76 }
77}