use serde::{Deserialize, Serialize};
pub const PROTOCOL_VERSION: u32 = 0;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Request<A> {
Query,
Act(A),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Response<V> {
State {
version: u64,
view: V,
},
Ack,
Error(String),
}
#[cfg(test)]
mod tests {
use super::{Request, Response};
#[test]
fn act_request_round_trips_through_json() {
let request = Request::Act(42u32);
let json = serde_json::to_string(&request).expect("serialize");
let decoded: Request<u32> = serde_json::from_str(&json).expect("deserialize");
assert_eq!(request, decoded);
}
#[test]
fn query_request_round_trips_through_json() {
let request: Request<u32> = Request::Query;
let json = serde_json::to_string(&request).expect("serialize");
let decoded: Request<u32> = serde_json::from_str(&json).expect("deserialize");
assert_eq!(request, decoded);
}
#[test]
fn state_response_encodes_its_view_inline_not_as_bytes() {
let response = Response::State {
version: 7,
view: 99u32,
};
let json = serde_json::to_string(&response).expect("serialize");
assert!(json.contains("\"view\":99"), "got {json}");
let decoded: Response<u32> = serde_json::from_str(&json).expect("deserialize");
assert_eq!(response, decoded);
}
#[test]
fn error_response_round_trips() {
let response: Response<u32> = Response::Error("no session found".to_owned());
let json = serde_json::to_string(&response).expect("serialize");
let decoded: Response<u32> = serde_json::from_str(&json).expect("deserialize");
assert_eq!(response, decoded);
}
}