scylla_cql/frame/request/
execute.rs

1use std::num::TryFromIntError;
2
3use crate::frame::frame_errors::CqlRequestSerializationError;
4use bytes::Bytes;
5use thiserror::Error;
6
7use crate::{
8    frame::request::{query, RequestOpcode, SerializableRequest},
9    frame::types,
10};
11
12use super::{
13    query::{QueryParameters, QueryParametersSerializationError},
14    DeserializableRequest, RequestDeserializationError,
15};
16
17#[cfg_attr(test, derive(Debug, PartialEq, Eq))]
18pub struct Execute<'a> {
19    pub id: Bytes,
20    pub parameters: query::QueryParameters<'a>,
21}
22
23impl SerializableRequest for Execute<'_> {
24    const OPCODE: RequestOpcode = RequestOpcode::Execute;
25
26    fn serialize(&self, buf: &mut Vec<u8>) -> Result<(), CqlRequestSerializationError> {
27        // Serializing statement id
28        types::write_short_bytes(&self.id[..], buf)
29            .map_err(ExecuteSerializationError::StatementIdSerialization)?;
30
31        // Serializing params
32        self.parameters
33            .serialize(buf)
34            .map_err(ExecuteSerializationError::QueryParametersSerialization)?;
35        Ok(())
36    }
37}
38
39impl DeserializableRequest for Execute<'_> {
40    fn deserialize(buf: &mut &[u8]) -> Result<Self, RequestDeserializationError> {
41        let id = types::read_short_bytes(buf)?.to_vec().into();
42        let parameters = QueryParameters::deserialize(buf)?;
43
44        Ok(Self { id, parameters })
45    }
46}
47
48/// An error type returned when serialization of EXECUTE request fails.
49#[non_exhaustive]
50#[derive(Error, Debug, Clone)]
51pub enum ExecuteSerializationError {
52    /// Failed to serialize query parameters.
53    #[error("Malformed query parameters: {0}")]
54    QueryParametersSerialization(QueryParametersSerializationError),
55
56    /// Failed to serialize prepared statement id.
57    #[error("Malformed statement id: {0}")]
58    StatementIdSerialization(TryFromIntError),
59}