fn select_plugin()

in src/plugin/mod.rs [106:138]


fn select_plugin(class_name: Option<&str>, function_name: &str) -> Option<&'static DynPlugin> {
    let mut selected_plugin = None;

    'plugin: for plugin in &*PLUGINS {
        if let Some(class_name) = class_name {
            if let Some(plugin_class_names) = plugin.class_names() {
                if plugin_class_names.contains(&class_name) {
                    selected_plugin = Some(plugin);
                    break 'plugin;
                }
            }
            if let Some(parent_classes) = plugin.parent_classes() {
                if let Ok(class) = ClassEntry::from_globals(class_name) {
                    // Iterate parent_classes and skip None.
                    for parent_class in parent_classes.into_iter().flatten() {
                        if class.is_instance_of(parent_class) {
                            selected_plugin = Some(plugin);
                            break 'plugin;
                        }
                    }
                }
            }
        }
        if let Some(function_name_prefix) = plugin.function_name_prefix() {
            if function_name.starts_with(function_name_prefix) {
                selected_plugin = Some(plugin);
                break 'plugin;
            }
        }
    }

    selected_plugin.map(AsRef::as_ref)
}