walrus_core/protocol/message/
server.rs1use compact_str::CompactString;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct SendResponse {
9 pub agent: CompactString,
11 pub content: String,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
17pub enum StreamEvent {
18 Start {
20 agent: CompactString,
22 },
23 Chunk {
25 content: String,
27 },
28 End {
30 agent: CompactString,
32 },
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
37pub enum DownloadEvent {
38 Start {
40 model: CompactString,
42 },
43 FileStart {
45 model: CompactString,
47 filename: String,
49 size: u64,
51 },
52 Progress {
54 model: CompactString,
56 bytes: u64,
58 },
59 FileEnd {
61 model: CompactString,
63 filename: String,
65 },
66 End {
68 model: CompactString,
70 },
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub enum HubEvent {
76 Start {
78 package: CompactString,
80 },
81 Step {
83 message: String,
85 },
86 End {
88 package: CompactString,
90 },
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95#[serde(tag = "type", rename_all = "snake_case")]
96pub enum ServerMessage {
97 Response(SendResponse),
99 Stream(StreamEvent),
101 Download(DownloadEvent),
103 Error {
105 code: u16,
107 message: String,
109 },
110 Pong,
112 Hub(HubEvent),
114}
115
116impl From<SendResponse> for ServerMessage {
117 fn from(r: SendResponse) -> Self {
118 Self::Response(r)
119 }
120}
121
122impl From<StreamEvent> for ServerMessage {
123 fn from(e: StreamEvent) -> Self {
124 Self::Stream(e)
125 }
126}
127
128impl From<DownloadEvent> for ServerMessage {
129 fn from(e: DownloadEvent) -> Self {
130 Self::Download(e)
131 }
132}
133
134impl From<HubEvent> for ServerMessage {
135 fn from(e: HubEvent) -> Self {
136 Self::Hub(e)
137 }
138}
139
140fn error_or_unexpected(msg: ServerMessage) -> anyhow::Error {
141 match msg {
142 ServerMessage::Error { code, message } => {
143 anyhow::anyhow!("server error ({code}): {message}")
144 }
145 other => anyhow::anyhow!("unexpected response: {other:?}"),
146 }
147}
148
149impl TryFrom<ServerMessage> for SendResponse {
150 type Error = anyhow::Error;
151 fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
152 match msg {
153 ServerMessage::Response(r) => Ok(r),
154 other => Err(error_or_unexpected(other)),
155 }
156 }
157}
158
159impl TryFrom<ServerMessage> for StreamEvent {
160 type Error = anyhow::Error;
161 fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
162 match msg {
163 ServerMessage::Stream(e) => Ok(e),
164 other => Err(error_or_unexpected(other)),
165 }
166 }
167}
168
169impl TryFrom<ServerMessage> for DownloadEvent {
170 type Error = anyhow::Error;
171 fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
172 match msg {
173 ServerMessage::Download(e) => Ok(e),
174 other => Err(error_or_unexpected(other)),
175 }
176 }
177}
178
179impl TryFrom<ServerMessage> for HubEvent {
180 type Error = anyhow::Error;
181 fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
182 match msg {
183 ServerMessage::Hub(e) => Ok(e),
184 other => Err(error_or_unexpected(other)),
185 }
186 }
187}