use interface::Update;
use std::sync::Arc;
use tokio::sync::Mutex;
pub use gmt_dos_actors_dsl::actorscript;
pub mod actor;
pub mod aggregation;
pub mod client;
pub mod framework;
pub mod graph;
pub mod model;
pub mod system;
#[derive(thiserror::Error, Debug)]
pub enum ActorError {
#[error("{msg} receiver disconnected")]
DropRecv {
msg: String,
source: flume::RecvError,
},
#[error("{msg} sender disconnected")]
DropSend {
msg: String,
source: flume::SendError<()>,
},
#[error("no new data produced")]
NoData,
#[error("no inputs defined")]
NoInputs,
#[error("no outputs defined")]
NoOutputs,
#[error("no client defined")]
NoClient,
#[error("output {0} dropped")]
Disconnected(String),
#[error("{0} has some inputs but inputs rate is zero")]
SomeInputsZeroRate(String),
#[error("{0} has no inputs but a positive inputs rate (May be this Actor should instead be an Initiator)")]
NoInputsPositiveRate(String),
#[error("{0} has some outputs but outputs rate is zero")]
SomeOutputsZeroRate(String),
#[error("{0} has no outputs but a positive outputs rate (May be this Actor should instead be a Terminator)")]
NoOutputsPositiveRate(String),
#[error(r#"Orphan output "{0}" in "{1}" actor"#)]
OrphanOutput(String, String),
}
pub(crate) type Result<R> = std::result::Result<R, ActorError>;
pub trait ArcMutex {
fn into_arcx(self) -> Arc<Mutex<Self>>
where
Self: Sized,
{
Arc::new(Mutex::new(self))
}
}
impl<C: Update> ArcMutex for C {}
mod macros;
pub(crate) fn trim(name: &str) -> String {
if let Some((prefix, suffix)) = name.split_once('<') {
let generics: Vec<_> = suffix.split(',').map(|s| trim(s)).collect();
format!("{}<{}", trim(prefix), generics.join(","))
} else {
if let Some((_, suffix)) = name.rsplit_once("::") {
suffix.into()
} else {
name.into()
}
}
}
pub mod prelude {
pub use super::{
actor::{Actor, Initiator, Terminator},
framework::{
model::{FlowChart, GetName},
network::{AddActorOutput, AddOuput, IntoLogs, IntoLogsN, TryIntoInputs},
},
model,
model::{Model, Unknown},
ArcMutex,
};
pub use vec_box::vec_box;
}