Skip to main content

kcl_engine_codec/
lib.rs

1//! Concrete serializers and deserializers for the engine WebSocket protocol.
2//!
3//! Keeping these entry points in a small crate lets Cargo cache the large serde
4//! monomorphizations generated for the modeling command types across `kcl-lib`
5//! recompiles.
6
7use kittycad_modeling_cmds::websocket::WebSocketRequest;
8use kittycad_modeling_cmds::websocket::WebSocketResponse;
9
10/// Deserialize a JSON engine response.
11pub fn deserialize_response_json(message: &str) -> Result<WebSocketResponse, serde_json::Error> {
12    serde_json::from_str(message)
13}
14
15/// Deserialize a MessagePack engine response.
16pub fn deserialize_response_msgpack(message: &[u8]) -> Result<WebSocketResponse, rmp_serde::decode::Error> {
17    rmp_serde::from_slice(message)
18}
19
20/// Serialize an engine request as JSON.
21pub fn serialize_request_json(request: &WebSocketRequest) -> Result<String, serde_json::Error> {
22    serde_json::to_string(request)
23}
24
25/// Serialize an engine request as named MessagePack.
26pub fn serialize_request_msgpack(request: &WebSocketRequest) -> Result<Vec<u8>, rmp_serde::encode::Error> {
27    rmp_serde::to_vec_named(request)
28}
29
30#[cfg(test)]
31mod tests {
32    use kittycad_modeling_cmds::websocket::OkWebSocketResponseData;
33
34    use super::*;
35
36    #[test]
37    fn request_serializers_accept_ping() {
38        let request = WebSocketRequest::Ping {};
39
40        assert_eq!(serialize_request_json(&request).unwrap(), r#"{"type":"ping"}"#);
41        assert!(!serialize_request_msgpack(&request).unwrap().is_empty());
42    }
43
44    #[test]
45    fn response_deserializers_round_trip_pong() {
46        let response = WebSocketResponse::success(None, OkWebSocketResponseData::Pong {});
47        let json = serde_json::to_string(&response).unwrap();
48        let msgpack = rmp_serde::to_vec_named(&response).unwrap();
49
50        assert_eq!(deserialize_response_json(&json).unwrap(), response);
51        assert_eq!(deserialize_response_msgpack(&msgpack).unwrap(), response);
52    }
53}