scratch_cloud_server/
messages.rs1use 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}