1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4#[serde(rename_all = "lowercase")]
5pub enum Mode {
6 State,
7 Append,
8 List,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum Operation {
13 Upsert,
14 Patch,
15 Delete,
16 Create,
17}
18
19impl std::str::FromStr for Operation {
20 type Err = std::convert::Infallible;
21
22 fn from_str(s: &str) -> Result<Self, Self::Err> {
23 Ok(match s {
24 "upsert" => Operation::Upsert,
25 "patch" => Operation::Patch,
26 "delete" => Operation::Delete,
27 "create" => Operation::Create,
28 _ => Operation::Upsert,
29 })
30 }
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct Frame {
35 pub mode: Mode,
36 #[serde(rename = "entity")]
37 pub entity: String,
38 pub op: String,
39 pub key: String,
40 pub data: serde_json::Value,
41}
42
43impl Frame {
44 pub fn entity_name(&self) -> &str {
45 &self.entity
46 }
47
48 pub fn operation(&self) -> Operation {
49 self.op.parse().unwrap()
50 }
51}
52
53pub fn parse_frame(bytes: &[u8]) -> Result<Frame, serde_json::Error> {
54 let text = String::from_utf8_lossy(bytes);
55 serde_json::from_str(&text)
56}