Skip to content
Snippets Groups Projects
optic_node.rs 2.49 KiB
Newer Older
use std::fmt::Debug;
/// An [`OpticNode`] is the basic struct representing an optical component.
pub struct OpticNode {
    name: String,
    node: Box<dyn Optical>,
    /// Creates a new [`OpticNode`]. The concrete type of the component must be given while using the `new` function.
    /// The node type ist a struct implementing the [`Optical`] trait. Since the size of the node type is not known at compile time it must be added as `Box<nodetype>`.
    /// 
    /// # Examples
    /// 
    /// ```
    /// use opossum::optic_node::OpticNode;
    /// use opossum::nodes::NodeDummy;
    ///
    /// let node=OpticNode::new("My node".into(), Box::new(NodeDummy));
    /// ```
    pub fn new(name: String, node: Box<dyn Optical>) -> Self {
        Self { name, node }
    }
    /// Sets the name of this [`OpticNode`].
    pub fn set_name(&mut self, name: String) {
        self.name = name;
    }
    /// Returns a reference to the name of this [`OpticNode`].
    pub fn name(&self) -> &str {
        self.name.as_ref()
    }
    /// Returns a string representation of the [`OpticNode`] in `graphviz` format.
    pub fn to_dot(&self) -> String {
        format!("  \"{}\"\n", self.name)
    /// Returns the concrete node type as string representation.
    pub fn node_type(&self) -> String {
        self.node.node_type()
    }
impl Debug for OpticNode {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.name)
    }
}

/// This trait must be implemented by all concrete optical components.
pub trait Optical {
    /// Return the type of the optical component (lens, filter, ...). The default implementation returns "undefined".
    fn node_type(&self) -> String {
        "undefined".into()
    }
}
#[cfg(test)]
mod test {
    use super::OpticNode;
    use crate::nodes::NodeDummy;
    #[test]
    fn new() {
        let node = OpticNode::new("Test".into(), Box::new(NodeDummy));
        assert_eq!(node.name, "Test".to_owned());
    fn set_name() {
        let mut node = OpticNode::new("Test".into(), Box::new(NodeDummy));
        node.set_name("Test2".into());
        assert_eq!(node.name, "Test2".to_owned())
    }
    #[test]
    fn name() {
        let node = OpticNode::new("Test".into(), Box::new(NodeDummy));
        assert_eq!(node.name(), "Test".to_owned())
    }
    #[test]
    fn to_dot() {
        let node = OpticNode::new("Test".into(), Box::new(NodeDummy));
        assert_eq!(node.to_dot(), "  \"Test\"\n".to_owned())