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_parent_id: usize,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub internal: bool,
#[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(String::new())
}
}
impl OutputConnection {
#[allow(clippy::too_many_arguments)]
#[must_use]
pub fn new(
source: Source,
destination_id: usize,
destination_io_number: usize,
destination_parent_id: usize,
internal: bool,
destination: String,
#[cfg(feature = "debugger")] name: String,
) -> Self {
OutputConnection {
source,
destination_id,
destination_io_number,
destination_parent_id,
internal,
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_parent_id,
self.destination_io_number
)?;
if !self.destination.is_empty() {
write!(f, " @ '{}'", self.destination)?;
}
write!(f, "")
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod test {
#[test]
fn display_with_route_test() {
let connection = super::OutputConnection::new(
super::Source::Output("/".into()),
1,
1,
1,
false,
"/flow1/input".into(),
#[cfg(feature = "debugger")]
"test-connection".into(),
);
println!("Connection: {connection}");
}
}