use std::fmt;
use std::path::PathBuf;
use serde_derive::{Deserialize, Serialize};
use flowcore::errors::*;
#[cfg(feature = "metrics")]
use flowcore::model::metrics::Metrics;
use flowcore::model::submission::Submission;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum ServerMessage {
FlowStart,
#[cfg(feature = "metrics")]
FlowEnd(Metrics),
#[cfg(not(feature = "metrics"))]
FlowEnd,
ServerExiting(Result<()>),
Stdout(String),
Stderr(String),
GetStdin,
GetLine,
GetArgs,
Read(PathBuf),
Write(String, Vec<u8>),
PixelWrite((u32, u32), (u8, u8, u8), (u32, u32), String),
StdoutEof,
StderrEof,
Invalid,
}
impl fmt::Display for ServerMessage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"ServerMessage {}",
match self {
#[cfg(feature = "metrics")]
ServerMessage::FlowEnd(_) => "FlowEnd".into(),
#[cfg(not(feature = "metrics"))]
ServerMessage::FlowEnd => "FlowEnd".into(),
ServerMessage::FlowStart => "FlowStart".into(),
ServerMessage::ServerExiting(result) =>
format!("ServerExiting with result: {result:?}"),
ServerMessage::Stdout(_) => "Stdout".into(),
ServerMessage::Stderr(_) => "Stderr".into(),
ServerMessage::GetStdin => "GetStdIn".into(),
ServerMessage::GetLine => "GetLine".into(),
ServerMessage::GetArgs => "GetArgs".into(),
ServerMessage::Read(_) => "Read".into(),
ServerMessage::Write(_, _) => "Write".into(),
ServerMessage::PixelWrite(_, _, _, _) => "PixelWrite".into(),
ServerMessage::StdoutEof => "StdOutEof".into(),
ServerMessage::StderrEof => "StdErrEof".into(),
ServerMessage::Invalid => "Invalid".into(),
}
)
}
}
unsafe impl Send for ServerMessage {}
unsafe impl Sync for ServerMessage {}
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone)]
pub struct FileMetaData {
pub is_file: bool,
pub is_dir: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum ClientMessage {
ClientSubmission(Submission),
EnterDebugger,
Ack,
Stdin(String),
Line(String),
Args(Vec<String>),
Error(String),
GetStdinEof,
GetLineEof,
Invalid,
FileContents(PathBuf, Vec<u8>),
ClientExiting(Result<()>),
}
impl fmt::Display for ClientMessage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"ClientMessage {}",
match self {
ClientMessage::Ack => "Ack".into(),
ClientMessage::Stdin(_) => "Stdin".into(),
ClientMessage::Line(_) => "Line".into(),
ClientMessage::Args(_) => "Args".into(),
ClientMessage::Error(_) => "Error".into(),
ClientMessage::GetStdinEof => "GetStdinEof".into(),
ClientMessage::GetLineEof => "GetLineEof".into(),
ClientMessage::ClientExiting(result) =>
format!("ClientExiting with server result: {result:?}"),
ClientMessage::ClientSubmission(_) => "ClientSubmission".into(),
ClientMessage::EnterDebugger => "EnterDebugger".into(),
ClientMessage::Invalid => "Invalid".into(),
ClientMessage::FileContents(_, _) => "FileContents".into(),
}
)
}
}
unsafe impl Send for ClientMessage {}
unsafe impl Sync for ClientMessage {}
impl From<ServerMessage> for String {
fn from(msg: ServerMessage) -> Self {
match serde_json::to_string(&msg) {
Ok(message_string) => message_string,
_ => String::new(),
}
}
}
impl From<String> for ServerMessage {
fn from(string: String) -> Self {
match serde_json::from_str(&string) {
Ok(message) => message,
_ => ServerMessage::Invalid,
}
}
}
impl From<ClientMessage> for String {
fn from(msg: ClientMessage) -> Self {
match serde_json::to_string(&msg) {
Ok(message_string) => message_string,
_ => String::new(),
}
}
}
impl From<String> for ClientMessage {
fn from(string: String) -> Self {
match serde_json::from_str(&string) {
Ok(message) => message,
_ => ClientMessage::Invalid,
}
}
}