hyperstack_sdk/
frame.rs

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}