From d80d9dd7ffbdf3563dffbbc755440a2579ee7dec Mon Sep 17 00:00:00 2001
From: Udo Eisenbarth <u.eisenbarth@gsi.de>
Date: Tue, 6 Jun 2023 14:20:51 +0200
Subject: [PATCH] Add OpticPort

---
 src/lib.rs        |  1 +
 src/optic_port.rs | 87 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 src/optic_port.rs

diff --git a/src/lib.rs b/src/lib.rs
index bf445e1f..7d4953a9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -4,6 +4,7 @@
 pub mod optic_scenery;
 /// The basic structure representing an optical element
 pub mod optic_node;
+pub mod optic_port;
 
 pub mod nodes;
 
diff --git a/src/optic_port.rs b/src/optic_port.rs
new file mode 100644
index 00000000..3a234775
--- /dev/null
+++ b/src/optic_port.rs
@@ -0,0 +1,87 @@
+#[derive(Debug, PartialEq, Clone)]
+pub enum OpticPortDirection {
+    Incoming,
+    Outgoing,
+}
+impl OpticPortDirection {
+    fn invert(self) -> OpticPortDirection {
+        if self == OpticPortDirection::Incoming {
+            OpticPortDirection::Outgoing
+        } else {
+            OpticPortDirection::Incoming
+        }
+    }
+}
+#[derive(Debug)]
+pub struct OpticPort {
+    name: String,
+    direction: OpticPortDirection,
+}
+
+impl OpticPort {
+    pub fn new(name: &str, direction: OpticPortDirection) -> Self {
+        Self{ name: name.into(), direction: direction }
+    }
+
+    pub fn set_name(&mut self, name: &str) {
+        self.name = name.into();
+    }
+
+    pub fn name(&self) -> &str {
+        self.name.as_ref()
+    }
+
+    pub fn set_direction(&mut self, direction: OpticPortDirection) {
+        self.direction = direction;
+    }
+
+    pub fn direction(&self) -> &OpticPortDirection {
+        &self.direction
+    }
+
+    pub fn invert(&mut self) {
+        self.direction = self.direction.clone().invert();
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use crate::optic_port::{OpticPort,OpticPortDirection};
+    #[test]
+    fn new() {
+        let port = OpticPort::new("Test", OpticPortDirection::Incoming);
+        assert_eq!(port.name, "Test");
+        assert_eq!(port.direction, OpticPortDirection::Incoming);
+    }
+    #[test]
+    fn set_name() {
+        let mut port = OpticPort::new("Test", OpticPortDirection::Incoming);
+        port.set_name("Test2");
+        assert_eq!(port.name, "Test2");
+        assert_eq!(port.direction, OpticPortDirection::Incoming);
+    }
+    #[test]
+    fn name() {
+        let port = OpticPort::new("Test", OpticPortDirection::Incoming);
+        assert_eq!(port.name(), "Test");
+    }
+    #[test]
+    fn set_direction() {
+        let mut port = OpticPort::new("Test", OpticPortDirection::Incoming);
+        port.set_direction(OpticPortDirection::Outgoing);
+        assert_eq!(port.name, "Test");
+        assert_eq!(port.direction, OpticPortDirection::Outgoing);
+    }
+    #[test]
+    fn direction() {
+        let port = OpticPort::new("Test", OpticPortDirection::Incoming);
+        assert_eq!(port.direction(), &OpticPortDirection::Incoming);
+    }
+    #[test]
+    fn invert() {
+        let mut port = OpticPort::new("Test", OpticPortDirection::Incoming);
+        port.invert();
+        assert_eq!(port.direction, OpticPortDirection::Outgoing);
+        assert_eq!(port.name, "Test");
+    }
+}
-- 
GitLab