querent_synapse/comm/types/
message.rs1use pyo3::{
3 exceptions::PyTypeError,
4 prelude::*,
5 types::{PyDict, PyString},
6};
7
8#[derive(Clone, Debug, PartialEq, Eq, Hash)]
10pub enum MessageType {
11 Start,
12 Stop,
13 Pause,
14 Resume,
15 Restart,
16 Status,
17 Metrics,
18}
19
20impl<'a> FromPyObject<'a> for MessageType {
22 fn extract(ob: &'a PyAny) -> PyResult<Self> {
23 if let Ok(message_type) = ob.extract::<&str>() {
25 match message_type {
27 "start" => Ok(MessageType::Start),
28 "stop" => Ok(MessageType::Stop),
29 "pause" => Ok(MessageType::Pause),
30 "resume" => Ok(MessageType::Resume),
31 "restart" => Ok(MessageType::Restart),
32 "status" => Ok(MessageType::Status),
33 "metrics" => Ok(MessageType::Metrics),
34 _ => Err(PyErr::new::<PyTypeError, _>("Invalid message type")),
36 }
37 } else {
38 Err(PyErr::new::<PyTypeError, _>("Invalid message type"))
40 }
41 }
42}
43
44impl IntoPy<PyObject> for MessageType {
46 fn into_py(self, py: Python) -> PyObject {
47 let string = PyString::new(py, &format!("{:?}", self));
49 string.into()
51 }
52}
53
54#[derive(Clone, Debug, PartialEq)]
56pub struct MessageState {
57 pub message_type: MessageType,
58 pub timestamp: f64,
59 pub payload: String,
60}
61
62impl<'a> FromPyObject<'a> for MessageState {
64 fn extract(ob: &'a PyAny) -> PyResult<Self> {
65 let message_type = ob.get_item("message_type")?.extract()?;
67 let timestamp = ob.get_item("timestamp")?.extract()?;
68 let payload = ob.get_item("payload")?.extract()?;
69 Ok(MessageState { message_type, timestamp, payload })
71 }
72}
73
74impl IntoPy<PyObject> for MessageState {
76 fn into_py(self, py: Python) -> PyObject {
77 let dict = PyDict::new(py);
79 dict.set_item("message_type", self.message_type.into_py(py)).unwrap();
81 dict.set_item("timestamp", self.timestamp).unwrap();
82 dict.set_item("payload", self.payload).unwrap();
83 dict.into()
85 }
86}