cassandra_protocol/frame/
message_request.rs

1use 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}