1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
5pub enum Command {
6 Set {
8 key: Vec<u8>,
10 value: Vec<u8>,
12 version: u64,
14 timestamp: i64,
16 },
17 Delete {
19 key: Vec<u8>,
21 version: u64,
23 timestamp: i64,
25 },
26}
27
28impl Command {
29 pub fn key(&self) -> &[u8] {
31 match self {
32 Command::Set { key, .. } | Command::Delete { key, .. } => key,
33 }
34 }
35
36 pub fn version(&self) -> u64 {
38 match self {
39 Command::Set { version, .. } | Command::Delete { version, .. } => *version,
40 }
41 }
42
43 pub fn timestamp(&self) -> i64 {
45 match self {
46 Command::Set { timestamp, .. } | Command::Delete { timestamp, .. } => *timestamp,
47 }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
56 fn round_trip_serialization() {
57 let cmd = Command::Set {
58 key: b"k".to_vec(),
59 value: b"v".to_vec(),
60 version: 7,
61 timestamp: 42,
62 };
63 let bytes = serde_cbor::to_vec(&cmd).expect("serialize");
64 let decoded: Command = serde_cbor::from_slice(&bytes).expect("deserialize");
65 assert_eq!(decoded, cmd);
66 }
67
68 #[test]
69 fn key_accessor_returns_expected_slice() {
70 let cmd = Command::Delete {
71 key: b"alpha".to_vec(),
72 version: 1,
73 timestamp: 5,
74 };
75 assert_eq!(cmd.key(), b"alpha");
76 assert_eq!(cmd.version(), 1);
77 assert_eq!(cmd.timestamp(), 5);
78 }
79}