scylla_cql/frame/request/
startup.rs1use thiserror::Error;
4
5use crate::frame::frame_errors::CqlRequestSerializationError;
6
7use std::{borrow::Cow, collections::HashMap, num::TryFromIntError};
8
9use crate::{
10 frame::request::{RequestOpcode, SerializableRequest},
11 frame::types,
12};
13
14use super::DeserializableRequest;
15
16pub struct Startup<'a> {
19 pub options: HashMap<Cow<'a, str>, Cow<'a, str>>,
21}
22
23impl SerializableRequest for Startup<'_> {
24 const OPCODE: RequestOpcode = RequestOpcode::Startup;
25
26 fn serialize(&self, buf: &mut Vec<u8>) -> Result<(), CqlRequestSerializationError> {
27 types::write_string_map(&self.options, buf)
28 .map_err(StartupSerializationError::OptionsSerialization)?;
29 Ok(())
30 }
31}
32
33#[non_exhaustive]
35#[derive(Error, Debug, Clone)]
36pub enum StartupSerializationError {
37 #[error("Malformed startup options: {0}")]
39 OptionsSerialization(TryFromIntError),
40}
41
42impl DeserializableRequest for Startup<'_> {
43 fn deserialize(buf: &mut &[u8]) -> Result<Self, super::RequestDeserializationError> {
44 let options = types::read_string_map(buf)?
47 .into_iter()
48 .map(|(k, v)| (k.into(), v.into()))
49 .collect();
50 Ok(Self { options })
51 }
52}