gmt_dos-actors 5.0.3

Giant Magellan Telescope Dynamic Optical Simulation Actor Model
Documentation
use crate::io::{InputObject, OutputObject};

#[derive(Debug, Hash)]
#[doc(hidden)]
pub struct IOData {
    pub name: String,
    pub hash: u64,
}
impl IOData {
    pub fn new(name: String, hash: u64) -> Self {
        Self { name, hash }
    }
}
#[derive(Debug, Hash)]
#[doc(hidden)]
pub enum IO {
    Bootstrap(IOData),
    Regular(IOData),
    Unbounded(IOData),
}
#[derive(Debug, Hash)]
#[doc(hidden)]
pub struct PlainActor {
    pub client: String,
    pub inputs_rate: usize,
    pub outputs_rate: usize,
    pub inputs: Option<Vec<IO>>,
    pub outputs: Option<Vec<IO>>,
    pub hash: u64,
}

impl From<&Box<dyn InputObject>> for IO {
    fn from(value: &Box<dyn InputObject>) -> Self {
        if let Some(_) = value.capacity() {
            IO::Regular(IOData::new(value.who(), value.get_hash()))
        } else {
            IO::Unbounded(IOData::new(value.who(), value.get_hash()))
        }
    }
}

impl From<&Box<dyn OutputObject>> for IO {
    fn from(value: &Box<dyn OutputObject>) -> Self {
        if value.bootstrap() {
            IO::Bootstrap(IOData::new(value.who(), value.get_hash()))
        } else {
            IO::Regular(IOData::new(value.who(), value.get_hash()))
        }
    }
}

impl IO {
    pub fn as_formatted_input(&self, actor_hash: u64, color: usize) -> String {
        match self {
            IO::Bootstrap(input) => format!(
                r#"{0} -> {1} [label="{2}", color={3}, style=bold];"#,
                input.hash,
                actor_hash,
                input.name.split("::").last().unwrap(),
                color
            ),
            IO::Regular(input) => format!(
                r#"{0} -> {1} [label="{2}", color={3}];"#,
                input.hash,
                actor_hash,
                input.name.split("::").last().unwrap(),
                color
            ),
            IO::Unbounded(input) => format!(
                r#"{0} -> {1} [label="{2}", color={3}, style=dashed];"#,
                input.hash,
                actor_hash,
                input.name.split("::").last().unwrap(),
                color
            ),
        }
    }
    pub fn as_formatted_output(&self, actor_hash: u64, color: usize) -> String {
        match self {
            IO::Bootstrap(output) => format!(
                r"{0} -> {1} [color={2}, style=bold];",
                actor_hash, output.hash, color
            ),
            IO::Regular(output) => {
                format!("{0} -> {1} [color={2}];", actor_hash, output.hash, color)
            }
            IO::Unbounded(output) => format!(
                r"{0} -> {1} [color={2}, style=dashed];",
                actor_hash, output.hash, color
            ),
        }
    }
}