Skip to main content

walrus_core/protocol/message/
convert.rs

1//! Conversions between protocol message types.
2
3use crate::protocol::proto::{
4    ClientMessage, DownloadEvent, SendMsg, SendResponse, ServerMessage, ServiceQueryResultMsg,
5    StreamEvent, StreamMsg, TaskEvent, client_message, download_event, server_message,
6    stream_event, task_event,
7};
8
9// ── ClientMessage constructors ───────────────────────────────────
10
11impl From<SendMsg> for ClientMessage {
12    fn from(msg: SendMsg) -> Self {
13        Self {
14            msg: Some(client_message::Msg::Send(msg)),
15        }
16    }
17}
18
19impl From<StreamMsg> for ClientMessage {
20    fn from(msg: StreamMsg) -> Self {
21        Self {
22            msg: Some(client_message::Msg::Stream(msg)),
23        }
24    }
25}
26
27// ── ServerMessage constructors ───────────────────────────────────
28
29impl From<SendResponse> for ServerMessage {
30    fn from(r: SendResponse) -> Self {
31        Self {
32            msg: Some(server_message::Msg::Response(r)),
33        }
34    }
35}
36
37impl From<StreamEvent> for ServerMessage {
38    fn from(e: StreamEvent) -> Self {
39        Self {
40            msg: Some(server_message::Msg::Stream(e)),
41        }
42    }
43}
44
45impl From<DownloadEvent> for ServerMessage {
46    fn from(e: DownloadEvent) -> Self {
47        Self {
48            msg: Some(server_message::Msg::Download(e)),
49        }
50    }
51}
52
53impl From<TaskEvent> for ServerMessage {
54    fn from(e: TaskEvent) -> Self {
55        Self {
56            msg: Some(server_message::Msg::Task(e)),
57        }
58    }
59}
60
61// ── TryFrom<ServerMessage> ───────────────────────────────────────
62
63fn error_or_unexpected(msg: ServerMessage) -> anyhow::Error {
64    match msg.msg {
65        Some(server_message::Msg::Error(e)) => {
66            anyhow::anyhow!("server error ({}): {}", e.code, e.message)
67        }
68        other => anyhow::anyhow!("unexpected response: {other:?}"),
69    }
70}
71
72impl TryFrom<ServerMessage> for SendResponse {
73    type Error = anyhow::Error;
74    fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
75        match msg.msg {
76            Some(server_message::Msg::Response(r)) => Ok(r),
77            _ => Err(error_or_unexpected(msg)),
78        }
79    }
80}
81
82impl TryFrom<ServerMessage> for stream_event::Event {
83    type Error = anyhow::Error;
84    fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
85        match msg.msg {
86            Some(server_message::Msg::Stream(e)) => {
87                e.event.ok_or_else(|| anyhow::anyhow!("empty stream event"))
88            }
89            _ => Err(error_or_unexpected(msg)),
90        }
91    }
92}
93
94impl TryFrom<ServerMessage> for download_event::Event {
95    type Error = anyhow::Error;
96    fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
97        match msg.msg {
98            Some(server_message::Msg::Download(e)) => e
99                .event
100                .ok_or_else(|| anyhow::anyhow!("empty download event")),
101            _ => Err(error_or_unexpected(msg)),
102        }
103    }
104}
105
106impl TryFrom<ServerMessage> for task_event::Event {
107    type Error = anyhow::Error;
108    fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
109        match msg.msg {
110            Some(server_message::Msg::Task(e)) => {
111                e.event.ok_or_else(|| anyhow::anyhow!("empty task event"))
112            }
113            _ => Err(error_or_unexpected(msg)),
114        }
115    }
116}
117
118impl TryFrom<ServerMessage> for ServiceQueryResultMsg {
119    type Error = anyhow::Error;
120    fn try_from(msg: ServerMessage) -> anyhow::Result<Self> {
121        match msg.msg {
122            Some(server_message::Msg::ServiceQueryResult(r)) => Ok(r),
123            _ => Err(error_or_unexpected(msg)),
124        }
125    }
126}