use serde::{Deserialize, Serialize};
use jellyflow_core::ops::GraphOp;
use super::{Diagnostic, DiagnosticTarget};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConnectDecision {
Accept,
Reject,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DeleteDecision {
Accept,
Reject,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EdgeEndpoint {
From,
To,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectPlan {
pub decision: ConnectDecision,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub diagnostics: Vec<Diagnostic>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub ops: Vec<GraphOp>,
}
impl ConnectPlan {
pub fn is_accept(&self) -> bool {
self.decision == ConnectDecision::Accept
}
pub fn is_reject(&self) -> bool {
self.decision == ConnectDecision::Reject
}
pub fn diagnostics(&self) -> &[Diagnostic] {
&self.diagnostics
}
pub fn ops(&self) -> &[GraphOp] {
&self.ops
}
pub fn into_ops(self) -> Vec<GraphOp> {
self.ops
}
pub fn accept() -> Self {
Self {
decision: ConnectDecision::Accept,
diagnostics: Vec::new(),
ops: Vec::new(),
}
}
pub fn from_ops(ops: impl IntoIterator<Item = GraphOp>) -> Self {
Self {
decision: ConnectDecision::Accept,
diagnostics: Vec::new(),
ops: ops.into_iter().collect(),
}
}
pub fn reject(message: impl Into<String>) -> Self {
Self::reject_with_diagnostic(Diagnostic::error(
"connect.rejected",
DiagnosticTarget::Graph,
message,
))
}
pub fn reject_with_diagnostic(diagnostic: Diagnostic) -> Self {
Self::reject_with_diagnostics(vec![diagnostic])
}
pub fn reject_with_diagnostics(diagnostics: Vec<Diagnostic>) -> Self {
Self {
decision: ConnectDecision::Reject,
diagnostics,
ops: Vec::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeletePlan {
pub decision: DeleteDecision,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub diagnostics: Vec<Diagnostic>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub ops: Vec<GraphOp>,
}
impl DeletePlan {
pub fn is_accept(&self) -> bool {
self.decision == DeleteDecision::Accept
}
pub fn is_reject(&self) -> bool {
self.decision == DeleteDecision::Reject
}
pub fn diagnostics(&self) -> &[Diagnostic] {
&self.diagnostics
}
pub fn ops(&self) -> &[GraphOp] {
&self.ops
}
pub fn into_ops(self) -> Vec<GraphOp> {
self.ops
}
pub fn accept() -> Self {
Self {
decision: DeleteDecision::Accept,
diagnostics: Vec::new(),
ops: Vec::new(),
}
}
pub fn from_ops(ops: impl IntoIterator<Item = GraphOp>) -> Self {
Self {
decision: DeleteDecision::Accept,
diagnostics: Vec::new(),
ops: ops.into_iter().collect(),
}
}
pub fn reject(message: impl Into<String>) -> Self {
Self::reject_with_diagnostic(Diagnostic::error(
"delete.rejected",
DiagnosticTarget::Graph,
message,
))
}
pub fn reject_with_diagnostic(diagnostic: Diagnostic) -> Self {
Self::reject_with_diagnostics(vec![diagnostic])
}
pub fn reject_with_diagnostics(diagnostics: Vec<Diagnostic>) -> Self {
Self {
decision: DeleteDecision::Reject,
diagnostics,
ops: Vec::new(),
}
}
}