use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
pub(super) struct Header<T> {
pub offset: u64,
pub records: Vec<T>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "camelCase")]
pub(super) enum Op<T> {
Push(T),
Pop(u64),
}
#[cfg(test)]
mod test {
use serde_json::{Value, json};
use super::*;
#[derive(serde::Deserialize)]
struct Vector {
name: String,
first: bool,
frame: String,
}
#[test]
fn vectors_round_trip() {
let vectors: Vec<Vector> = serde_json::from_str(include_str!("../../tests/window-vectors.json")).unwrap();
for vector in vectors {
let encoded = match vector.first {
true => {
let header: Header<Value> =
serde_json::from_str(&vector.frame).unwrap_or_else(|err| panic!("{}: {err}", vector.name));
serde_json::to_string(&header).unwrap()
}
false => {
let op: Op<Value> =
serde_json::from_str(&vector.frame).unwrap_or_else(|err| panic!("{}: {err}", vector.name));
serde_json::to_string(&op).unwrap()
}
};
assert_eq!(encoded, vector.frame, "{}", vector.name);
}
}
#[test]
fn frames_have_the_expected_shapes() {
let header = Header {
offset: 4,
records: vec![json!({ "a": 1 })],
};
assert_eq!(
serde_json::to_value(&header).unwrap(),
json!({ "offset": 4, "records": [{ "a": 1 }] })
);
assert_eq!(
serde_json::to_value(Op::Push(json!({ "a": 1 }))).unwrap(),
json!({ "push": { "a": 1 } })
);
assert_eq!(serde_json::to_value(Op::<Value>::Pop(2)).unwrap(), json!({ "pop": 2 }));
}
}