scylla_cql/frame/request/
register.rs

1//! CQL protocol-level representation of a `REGISTER` request.
2
3use std::num::TryFromIntError;
4
5use thiserror::Error;
6
7use crate::frame::{
8    frame_errors::CqlRequestSerializationError,
9    request::{RequestOpcode, SerializableRequest},
10    server_event_type::EventType,
11    types,
12};
13
14/// The CQL protocol-level representation of an `REGISTER` request,
15/// used to subscribe for server events.
16pub struct Register {
17    /// A list of event types to register for.
18    pub event_types_to_register_for: Vec<EventType>,
19}
20
21impl SerializableRequest for Register {
22    const OPCODE: RequestOpcode = RequestOpcode::Register;
23
24    fn serialize(&self, buf: &mut Vec<u8>) -> Result<(), CqlRequestSerializationError> {
25        let event_types_list = self
26            .event_types_to_register_for
27            .iter()
28            .map(|event| event.to_string())
29            .collect::<Vec<_>>();
30
31        types::write_string_list(&event_types_list, buf)
32            .map_err(RegisterSerializationError::EventTypesSerialization)?;
33        Ok(())
34    }
35}
36
37/// An error type returned when serialization of REGISTER request fails.
38#[non_exhaustive]
39#[derive(Error, Debug, Clone)]
40pub enum RegisterSerializationError {
41    /// Failed to serialize event types list.
42    #[error("Failed to serialize event types list: {0}")]
43    EventTypesSerialization(TryFromIntError),
44}