use std::fmt;
use serde_derive::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Clone, PartialEq, Eq, Debug)]
pub enum Conversion {
WrapAsArray,
ArraySerialize,
}
#[derive(Deserialize, Serialize, Clone, PartialEq, Eq, Debug, Hash)]
pub enum Source {
Output(String),
Input(usize),
}
#[derive(Deserialize, Serialize, Clone, PartialEq, Eq, Debug)]
pub struct OutputConnection {
#[serde(default = "Source::default", skip_serializing_if = "is_default_source")]
pub source: Source,
pub destination_id: usize,
pub destination_io_number: usize,
pub destination_flow_id: usize,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub destination: String,
#[cfg(feature = "debugger")]
#[serde(default, skip_serializing_if = "String::is_empty")]
name: String,
}
fn is_default_source(source: &Source) -> bool {
matches!(source, Source::Output(subroute) if subroute.is_empty())
}
impl Default for Source {
fn default() -> Self {
Self::Output("".into())
}
}
impl OutputConnection {
#[allow(clippy::too_many_arguments)]
pub fn new(
source: Source,
destination_id: usize,
destination_io_number: usize,
flow_id: usize,
destination: String,
#[cfg(feature = "debugger")] name: String,
) -> Self {
OutputConnection {
source,
destination_id,
destination_io_number,
destination_flow_id: flow_id,
destination,
#[cfg(feature = "debugger")]
name,
}
}
}
impl fmt::Display for Source {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Source::Output(subroute) if subroute.is_empty() => Ok(()),
Source::Output(subroute) => write!(f, "{subroute}"),
Source::Input(index) => write!(f, ":{index}"),
}
}
}
impl fmt::Display for OutputConnection {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Output '{}' -> Function #{}({}):{}", self.source,
self.destination_id, self.destination_flow_id, self.destination_io_number)?;
if !self.destination.is_empty() {
write!(f, " @ '{}'", self.destination)?;
}
write!(f, "")
}
}
#[cfg(test)]
mod test {
#[test]
fn display_with_route_test() {
let connection = super::OutputConnection::new(
super::Source::Output("/".into()),
1,
1,
1,
"/flow1/input".into(),
#[cfg(feature = "debugger")]
"test-connection".into(),
);
println!("Connection: {connection}");
}
}