scylla_cql/frame/request/
execute.rs

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