use rc_x509_proto::{
encode,
protocol::v1::{self, client_to_server::Message},
};
use crate::connection::{ConnectionId, GracefulDisconnectionCount, UngracefulDisconnectionCount};
#[derive(Debug, PartialEq, Clone)]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub enum ClientToServer {
Pong,
ClientHello {
conn_id: ConnectionId,
graceful: GracefulDisconnectionCount,
ungraceful: UngracefulDisconnectionCount,
},
}
impl From<&ClientToServer> for Vec<u8> {
fn from(value: &ClientToServer) -> Self {
let wire = match value {
ClientToServer::ClientHello {
conn_id,
graceful,
ungraceful,
} => Message::ClientHello(v1::ClientHello {
connection_id: conn_id.as_raw(),
graceful_disconnection_count: graceful.as_raw(),
ungraceful_disconnection_count: ungraceful.as_raw(),
}),
ClientToServer::Pong => Message::Pong(v1::Pong::default()),
};
encode(&v1::ClientToServer {
message: Some(wire),
})
}
}
#[cfg(test)]
mod tests {
use proptest::prelude::*;
use super::*;
proptest! {
#[test]
fn prop_message_serialisation(
a in any::<ClientToServer>(),
b in any::<ClientToServer>(),
) {
let a_out = Vec::from(&a);
let b_out = Vec::from(&b);
assert_eq!(a_out, Vec::from(&a));
assert_eq!(b_out, Vec::from(&b));
assert_eq!(
a == b,
a_out == b_out,
);
}
}
}