use std::collections::BTreeMap;
use chrono::prelude::*;
use serde::{Deserialize, Serialize};
use crate::{
message::EditableTask,
state::{Group, State},
task::Task,
};
#[macro_export]
macro_rules! success_msg {
($($arg:tt)*) => {{
create_success_response(format!($($arg)*))
}}
}
#[macro_export]
macro_rules! failure_msg {
($($arg:tt)*) => {{
create_failure_response(format!($($arg)*))
}}
}
pub fn create_success_response<T: ToString>(text: T) -> Response {
Response::Success(text.to_string())
}
pub fn create_failure_response<T: ToString>(text: T) -> Response {
Response::Failure(text.to_string())
}
macro_rules! impl_into_response {
($inner:ty, $variant:expr) => {
impl From<$inner> for Response {
fn from(message: $inner) -> Self {
$variant(message)
}
}
};
}
#[derive(PartialEq, Eq, Clone, Debug, Deserialize, Serialize)]
pub enum Response {
AddedTask(AddedTaskResponse),
Edit(Vec<EditableTask>),
Status(Box<State>),
Log(BTreeMap<usize, TaskLogResponse>),
Group(GroupResponse),
Stream(StreamResponse),
Success(String),
Failure(String),
Close,
}
impl Response {
pub fn success(&self) -> bool {
matches!(&self, Self::AddedTask(_) | Self::Success(_))
}
}
#[derive(PartialEq, Eq, Clone, Debug, Default, Deserialize, Serialize)]
pub struct AddedTaskResponse {
pub task_id: usize,
pub enqueue_at: Option<DateTime<Local>>,
pub group_is_paused: bool,
}
impl_into_response!(AddedTaskResponse, Response::AddedTask);
#[derive(PartialEq, Eq, Clone, Deserialize, Serialize)]
pub struct TaskLogResponse {
pub task: Task,
pub output_complete: bool,
pub output: Option<Vec<u8>>,
}
impl_into_response!(BTreeMap<usize, TaskLogResponse>, Response::Log);
impl std::fmt::Debug for TaskLogResponse {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("TaskLogResponse")
.field("task", &self.task)
.field("output_complete", &self.output_complete)
.field("output", &"hidden")
.finish()
}
}
#[derive(PartialEq, Eq, Clone, Debug, Deserialize, Serialize)]
pub struct GroupResponse {
pub groups: BTreeMap<String, Group>,
}
impl_into_response!(GroupResponse, Response::Group);
#[derive(PartialEq, Eq, Clone, Debug, Deserialize, Serialize)]
pub struct StreamResponse {
pub logs: BTreeMap<usize, String>,
}
impl_into_response!(StreamResponse, Response::Stream);