Newer
Older
/// An [`OpticNode`] is the basic struct representing an optical component.
pub struct OpticNode {
name: String,
/// 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 {
/// 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;
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())
}
let node = OpticNode::new("Test".into(), Box::new(NodeDummy));
assert_eq!(node.to_dot(), " \"Test\"\n".to_owned())