use crate::{
BoxFuture,
error::Error,
extension::TomlTableExt,
state::{Env, State},
};
use smallvec::SmallVec;
use toml::value::Table;
pub struct Plugin {
name: &'static str,
loader: Option<BoxFuture<'static, Result<(), Error>>>,
environments: SmallVec<[Env; 2]>,
dependencies: SmallVec<[&'static str; 2]>,
}
impl Plugin {
#[inline]
pub fn new(name: &'static str) -> Self {
Self {
name,
loader: None,
environments: SmallVec::new(),
dependencies: SmallVec::new(),
}
}
#[inline]
pub fn with_loader(name: &'static str, loader: BoxFuture<'static, Result<(), Error>>) -> Self {
Self {
name,
loader: Some(loader),
environments: SmallVec::new(),
dependencies: SmallVec::new(),
}
}
#[inline]
pub fn set_loader(&mut self, loader: BoxFuture<'static, Result<(), Error>>) {
self.loader = Some(loader);
}
#[inline]
pub fn enable_dev(&mut self) {
if !self.environments.contains(&Env::Dev) {
self.environments.push(Env::Dev);
}
}
#[inline]
pub fn enable_prod(&mut self) {
if !self.environments.contains(&Env::Prod) {
self.environments.push(Env::Prod);
}
}
#[inline]
pub fn enable(&mut self, env: &'static str) {
let custom_env = Env::Custom(env);
if !self.environments.contains(&custom_env) {
self.environments.push(custom_env);
}
}
#[inline]
pub fn add_dependency(&mut self, dependency: &'static str) {
if !self.dependencies.contains(&dependency) {
self.dependencies.push(dependency);
}
}
#[inline]
pub fn get_config(&self) -> Option<&'static Table> {
State::shared()
.config()
.get_table("plugins")?
.get_table(self.name())
}
#[inline]
pub fn name(&self) -> &'static str {
self.name
}
#[inline]
pub fn dependencies(&self) -> &[&'static str] {
self.dependencies.as_slice()
}
#[inline]
pub fn enabled(&self, env: &Env) -> bool {
let environments = &self.environments;
if environments.is_empty() {
true
} else {
environments.contains(env)
}
}
#[inline]
pub async fn load(self) -> Result<(), Error> {
if let Some(loader) = self.loader {
loader.await
} else {
Ok(())
}
}
}