1use anyhow::Result;
6use bincode::Options;
7use serde::{Deserialize, Serialize};
8
9use crate::btree::baildon::BaildonKey;
10use crate::btree::baildon::BaildonValue;
11use crate::BINCODER;
12
13#[derive(Debug, PartialEq, Serialize, Deserialize)]
14pub(crate) enum Command<K, V> {
15 Upsert(K, V),
16 Delete(K),
17}
18
19impl<K, V> Command<K, V>
20where
21 K: BaildonKey,
22 V: BaildonValue,
23{
24 pub(crate) fn serialize(&self) -> Result<Vec<u8>> {
25 let s_cmd = BINCODER.serialize(&self)?;
26 Ok(s_cmd)
27 }
28
29 pub(crate) fn deserialize(buf: &[u8]) -> Result<Self> {
30 BINCODER.deserialize(buf).map_err(|e| e.into())
31 }
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37
38 #[test]
39 fn it_serializes_upsert_command() {
40 let upsert = Command::Upsert("this".to_string(), "that".to_string());
41 let s_upsert = upsert.serialize().expect("serializes");
42 let new_upsert = Command::deserialize(&s_upsert).expect("deserializes");
43 assert_eq!(upsert, new_upsert);
44 }
45
46 #[test]
47 fn it_serializes_delete_command() {
48 let delete_: Command<String, usize> = Command::Delete("this".to_string());
49 let s_delete = delete_.serialize().expect("serializes");
50 let new_delete = Command::deserialize(&s_delete).expect("deserializes");
51 assert_eq!(delete_, new_delete);
52 }
53}