panda/api/
require_plugin.rs

1use crate::sys::{panda_add_arg, panda_load_plugin, panda_plugin_path};
2use crate::PandaArgs;
3
4use std::ffi::CString;
5
6/// Require a plugin to be loaded, and if it isn't loaded load it with the given
7/// arguments. If the plugin is already loaded the arguments will be discarded.
8pub fn require_plugin<Args: PandaArgs>(plugin: &Args) {
9    let plugin_name = CString::new(Args::PLUGIN_NAME).unwrap();
10
11    let path = unsafe { panda_plugin_path(plugin_name.as_ptr()) };
12
13    for (name, arg) in plugin.to_panda_args() {
14        let arg = CString::new(format!("{}={}", name, arg)).unwrap();
15        unsafe {
16            panda_add_arg(plugin_name.as_ptr(), arg.as_ptr());
17        }
18    }
19
20    unsafe {
21        panda_load_plugin(path, plugin_name.as_ptr());
22    }
23}