use facet::Facet;
use crate::{ConnectionSettings, Metadata, Parity, Schema, SessionResumeKey};
#[derive(Debug, Clone, Facet)]
#[repr(u8)]
pub enum HandshakeMessage {
Hello(Hello),
HelloYourself(HelloYourself),
LetsGo(LetsGo),
Sorry(Sorry),
}
#[derive(Debug, Clone, Facet)]
pub struct Hello {
pub parity: Parity,
pub connection_settings: ConnectionSettings,
pub message_payload_schema: Vec<Schema>,
#[facet(default)]
pub supports_retry: bool,
#[facet(default)]
pub resume_key: Option<ResumeKeyBytes>,
#[facet(default)]
pub metadata: Metadata<'static>,
}
#[derive(Debug, Clone, Facet)]
pub struct HelloYourself {
pub connection_settings: ConnectionSettings,
pub message_payload_schema: Vec<Schema>,
#[facet(default)]
pub supports_retry: bool,
#[facet(default)]
pub resume_key: Option<ResumeKeyBytes>,
#[facet(default)]
pub metadata: Metadata<'static>,
}
#[derive(Debug, Clone, Facet)]
pub struct LetsGo {}
#[derive(Debug, Clone, Facet)]
pub struct Sorry {
pub reason: String,
}
#[derive(Debug, Clone, Facet)]
pub struct ResumeKeyBytes {
pub bytes: Vec<u8>,
}
impl ResumeKeyBytes {
pub fn from_key(key: &SessionResumeKey) -> Self {
Self {
bytes: key.0.to_vec(),
}
}
pub fn to_key(&self) -> Option<SessionResumeKey> {
if self.bytes.len() == 16 {
let mut arr = [0u8; 16];
arr.copy_from_slice(&self.bytes);
Some(SessionResumeKey(arr))
} else {
None
}
}
}
#[derive(Debug, Clone)]
pub struct HandshakeResult {
pub role: crate::SessionRole,
pub our_settings: ConnectionSettings,
pub peer_settings: ConnectionSettings,
pub peer_supports_retry: bool,
pub session_resume_key: Option<SessionResumeKey>,
pub peer_resume_key: Option<SessionResumeKey>,
pub our_schema: Vec<Schema>,
pub peer_schema: Vec<Schema>,
pub peer_metadata: Metadata<'static>,
}