use std::fmt;
use serde_derive::{Deserialize, Serialize};
use serde_json::Value;
use flowcore::model::input::Input;
use flowcore::model::output_connection::OutputConnection;
use flowcore::model::runtime_function::RuntimeFunction;
use flowrlib::block::Block;
use flowrlib::job::Job;
use flowrlib::run_state::{RunState, State};
#[allow(clippy::large_enum_variant)]
#[derive(Serialize, Deserialize)]
pub enum DebugServerMessage {
JobCompleted(Job),
EnteringDebugger,
ExitingDebugger,
PriorToSendingJob(Job),
BlockBreakpoint(Block),
FlowUnblockBreakpoint(usize),
DataBreakpoint(String, usize, String, Value, usize, String, String, usize),
Panic(String, usize),
JobError(Job),
Deadlock(String),
ExecutionStarted,
ExecutionEnded,
Error(String),
Functions(Vec<RuntimeFunction>),
FunctionStates((RuntimeFunction, Vec<State>)),
SendingValue(usize, Value, usize, usize),
OverallState(RunState),
InputState(Input),
OutputState(Vec<OutputConnection>),
BlockState(Vec<Block>),
Message(String),
Resetting,
WaitingForCommand(usize),
Invalid,
}
impl fmt::Display for DebugServerMessage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"DebugServerMessage {}",
match self {
DebugServerMessage::JobCompleted(_) => "JobCompleted",
DebugServerMessage::EnteringDebugger => "EnteringDebugger",
DebugServerMessage::ExitingDebugger => "ExitingDebugger",
DebugServerMessage::PriorToSendingJob(_) => "PriorToSendingJob",
DebugServerMessage::BlockBreakpoint(_) => "BlockBreakpoint",
DebugServerMessage::DataBreakpoint(_, _, _, _, _, _, _, _) => "DataBreakpoint",
DebugServerMessage::Deadlock(_) => "Deadlock",
DebugServerMessage::Error(_) => "Error",
DebugServerMessage::ExecutionStarted => "ExecutionStarted",
DebugServerMessage::ExecutionEnded => "ExecutionEnded",
DebugServerMessage::Functions(_) => "Functions",
DebugServerMessage::FunctionStates(_) => "FunctionState",
DebugServerMessage::JobError(_) => "JobError",
DebugServerMessage::SendingValue(_, _, _, _) => "SendingValue",
DebugServerMessage::OverallState(_) => "OverallState",
DebugServerMessage::Panic(_, _) => "Panic",
DebugServerMessage::InputState(_) => "InputState",
DebugServerMessage::OutputState(_) => "OutputState",
DebugServerMessage::BlockState(_) => "BlockState",
DebugServerMessage::Message(_) => "Message",
DebugServerMessage::Resetting => "Resetting",
DebugServerMessage::WaitingForCommand(_) => "WaitingForCommand",
DebugServerMessage::Invalid => "Invalid",
DebugServerMessage::FlowUnblockBreakpoint(_) => "FlowUnblockBreakpoint"
}
)
}
}
impl From<DebugServerMessage> for String {
fn from(msg: DebugServerMessage) -> Self {
match serde_json::to_string(&msg) {
Ok(message_string) => message_string,
_ => String::new(),
}
}
}
impl From<String> for DebugServerMessage {
fn from(msg: String) -> Self {
match serde_json::from_str(&msg) {
Ok(message) => message,
_ => DebugServerMessage::Invalid,
}
}
}