1use serde::{Deserialize, Serialize};
2use std::convert::TryFrom;
3
4pub mod log;
5pub mod nucleon;
6pub mod system;
7pub mod util;
8
9pub mod prelude {
10 pub use super::log::*;
11 pub use super::nucleon::*;
12 pub use super::system::*;
13 pub use super::{Message, MessageType, Recipient, Reply, Request};
14
15 pub use super::util::*;
16
17 pub use std::convert::TryFrom;
18
19 pub use serde_json::Value;
20}
21
22#[derive(Clone, Debug, Serialize, Deserialize)]
23pub enum Request {
24 System(system::SystemRequest),
25 Nucleon(nucleon::NucleonRequest),
26}
27
28#[derive(Clone, Debug, Serialize, Deserialize)]
29pub enum Reply {
30 System(system::SystemReply),
31 Nucleon(nucleon::NucleonReply),
32}
33
34#[derive(Clone, Debug, Serialize, Deserialize)]
35pub enum MessageType {
36 Request(Request),
37 Reply(Reply),
38 Log(log::LogMessage),
39}
40
41impl ReplyTrait for MessageType {}
42
43trait ReplyTrait {}
44
45#[derive(Clone, Debug, Serialize, Deserialize)]
46pub enum Recipient {
47 Unicast(String),
48 Broadcast,
49}
50
51#[derive(Clone, Debug, Serialize, Deserialize)]
52pub struct Message {
53 pub message: MessageType,
54 pub id: u8,
55 pub recipient: Recipient,
56 pub sender: String,
57}
58
59impl TryFrom<&str> for Message {
60 type Error = serde_json::Error;
61
62 #[inline]
63 fn try_from(msg: &str) -> Result<Self, Self::Error> {
64 serde_json::from_str::<Message>(msg)
65 }
66}
67
68impl TryFrom<&Message> for String {
69 type Error = serde_json::Error;
70
71 #[inline]
72 fn try_from(msg: &Message) -> Result<Self, Self::Error> {
73 serde_json::to_string(msg)
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 #[test]
80 fn builder() {
81 use crate::prelude::*;
82 let _reply = Reply::System(SystemReply::Success);
83 }
85}