use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BatchRequest {
pub v: u32,
pub ops: Vec<BatchItem>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BatchItem {
pub code: u32,
#[serde(with = "crate::encoding::bin_bytes")]
pub payload: Vec<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BatchReply {
#[serde(with = "crate::encoding::vec_bin_bytes")]
pub results: Vec<Vec<u8>>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::framing::{decode_named, encode_named};
#[test]
fn given_a_batch_when_round_tripped_then_should_preserve_items_and_results() {
let request = BatchRequest {
v: crate::codes::BATCH_OP_VERSION,
ops: vec![
BatchItem {
code: crate::codes::AGDX_KV_GET_CODE,
payload: b"\xa1av\x01".to_vec(),
},
BatchItem {
code: crate::codes::AGDX_QUERY_CODE,
payload: Vec::new(),
},
],
};
let decoded: BatchRequest =
decode_named(&encode_named(&request).expect("encodes")).expect("decodes");
assert_eq!(decoded.ops.len(), 2);
assert_eq!(decoded.ops[0].code, crate::codes::AGDX_KV_GET_CODE);
assert_eq!(decoded.ops[0].payload, request.ops[0].payload);
let reply = BatchReply {
results: vec![b"ok".to_vec(), Vec::new()],
};
let decoded: BatchReply =
decode_named(&encode_named(&reply).expect("encodes")).expect("decodes");
assert_eq!(decoded.results, reply.results);
}
}