#![deny(unsafe_code)]
use crate::entry::prelude::*;
use crate::prelude::*;
use std::ffi::CStr;
use std::marker::PhantomData;
pub struct SinglePluginEntry<P: DefaultPluginFactory> {
plugin_factory: PluginFactoryWrapper<SinglePluginFactory<P>>,
}
impl<P: DefaultPluginFactory> Entry for SinglePluginEntry<P> {
fn new(_plugin_path: Option<&CStr>) -> Result<Self, EntryLoadError> {
Ok(Self {
plugin_factory: PluginFactoryWrapper::new(SinglePluginFactory {
descriptor: P::get_descriptor(),
_plugin: PhantomData,
}),
})
}
#[inline]
fn declare_factories<'a>(&'a self, builder: &mut EntryFactories<'a>) {
builder.register_factory(&self.plugin_factory);
}
}
struct SinglePluginFactory<P> {
descriptor: PluginDescriptor,
_plugin: PhantomData<fn() -> P>,
}
impl<P: DefaultPluginFactory> PluginFactoryImpl for SinglePluginFactory<P> {
#[inline]
fn plugin_count(&self) -> u32 {
1
}
#[inline]
fn plugin_descriptor(&self, index: u32) -> Option<&PluginDescriptor> {
match index {
0 => Some(&self.descriptor),
_ => None,
}
}
#[inline]
fn create_plugin<'a>(
&'a self,
host_info: HostInfo<'a>,
plugin_id: &CStr,
) -> Option<PluginInstance<'a>> {
if plugin_id == self.descriptor.id().unwrap_or_default() {
Some(PluginInstance::new::<P>(
host_info,
&self.descriptor,
P::new_shared,
P::new_main_thread,
))
} else {
None
}
}
}
pub trait DefaultPluginFactory: Plugin {
fn get_descriptor() -> PluginDescriptor;
fn new_shared(host: HostSharedHandle<'_>) -> Result<Self::Shared<'_>, PluginError>;
fn new_main_thread<'a>(
host: HostMainThreadHandle<'a>,
shared: &'a Self::Shared<'a>,
) -> Result<Self::MainThread<'a>, PluginError>;
}