scratch_cloud_server/
messages.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Deserialize, Debug)]
4#[serde(tag = "method")]
5#[serde(rename_all = "snake_case")]
6pub enum ServerboundMessage {
7    Handshake(Handshake),
8    Set(Set),
9    Create(Set),
10    Rename(Rename),
11    Delete(Delete),
12}
13
14#[derive(Serialize, Debug)]
15#[serde(tag = "method")]
16#[serde(rename_all = "snake_case")]
17pub enum ClientboundMessage {
18    Set(Set),
19}
20
21#[derive(Deserialize, Debug)]
22pub struct Handshake {
23    project_id: String,
24    user: String,
25}
26impl Handshake {
27    pub fn project_id(&self) -> &str {
28        &self.project_id
29    }
30
31    pub fn user(&self) -> &str {
32        &self.user
33    }
34}
35
36#[derive(Debug, Clone)]
37pub enum Value {
38    Number(f64),
39    String(String),
40}
41
42impl<'de> Deserialize<'de> for Value {
43    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44    where
45        D: serde::de::Deserializer<'de>,
46    {
47        let intermediate = serde_json::Value::deserialize(deserializer)?;
48        match intermediate {
49            serde_json::Value::Number(n) => match n.as_f64() {
50                Some(n) => Ok(Value::Number(n)),
51                None => Err(serde::de::Error::custom("number doesn't fit in f64")),
52            },
53            serde_json::Value::String(s) => Ok(Value::String(s)),
54            _ => Err(serde::de::Error::custom("expected string or number")),
55        }
56    }
57}
58
59impl Serialize for Value {
60    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
61    where
62        S: serde::ser::Serializer,
63    {
64        match self {
65            Value::Number(n) => serializer.serialize_f64(*n),
66            Value::String(s) => serializer.serialize_str(s),
67        }
68    }
69}
70
71impl From<String> for Value {
72    fn from(s: String) -> Self {
73        Self::String(s)
74    }
75}
76impl From<&str> for Value {
77    fn from(s: &str) -> Self {
78        Self::String(s.to_string())
79    }
80}
81impl From<f64> for Value {
82    fn from(value: f64) -> Self {
83        Self::Number(value)
84    }
85}
86
87#[derive(Deserialize, Serialize, Debug)]
88pub struct Set {
89    name: String,
90    value: Value,
91}
92impl Set {
93    pub fn new(name: String, value: Value) -> Self {
94        Self { name, value }
95    }
96
97    pub fn name(&self) -> &str {
98        &self.name
99    }
100
101    pub fn value(&self) -> &Value {
102        &self.value
103    }
104}
105
106#[derive(Deserialize, Debug)]
107pub struct Rename {
108    name: String,
109    new_name: String,
110}
111impl Rename {
112    pub fn old_name(&self) -> &str {
113        &self.name
114    }
115
116    pub fn new_name(&self) -> &str {
117        &self.new_name
118    }
119}
120
121#[derive(Deserialize, Debug)]
122pub struct Delete {
123    name: String,
124}
125impl Delete {
126    pub fn name(&self) -> &str {
127        &self.name
128    }
129}