use std::fmt;
use {
super::{Module, ModuleId},
crate::api::version::Version,
};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum ModuleState {
#[default]
Loaded,
Initializing,
Running,
Unloading,
Failed(String),
}
impl ModuleState {
#[must_use]
pub const fn can_transition_to(&self, next: &Self) -> bool {
if matches!(next, Self::Failed(_)) {
return true;
}
matches!(
(self, next),
(Self::Loaded, Self::Initializing)
| (Self::Initializing, Self::Running)
| (Self::Running, Self::Unloading)
)
}
}
impl fmt::Display for ModuleState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Loaded => write!(f, "loaded"),
Self::Initializing => write!(f, "initializing"),
Self::Running => write!(f, "running"),
Self::Unloading => write!(f, "unloading"),
Self::Failed(msg) => write!(f, "failed: {msg}"),
}
}
}
#[derive(Debug, Clone)]
pub struct ModuleInfo {
pub id: ModuleId,
pub name: &'static str,
pub version: Version,
pub api_version: Version,
pub description: &'static str,
pub authors: &'static [&'static str],
pub license: &'static str,
}
impl ModuleInfo {
#[must_use]
pub fn from_module<M: Module>(module: &M) -> Self {
Self {
id: module.id(),
name: module.name(),
version: module.version(),
api_version: module.api_version(),
description: "",
authors: &[],
license: "",
}
}
}