Skip to main content

codineer_plugins/
definition.rs

1use std::path::Path;
2
3use crate::constants::BUILTIN_MARKETPLACE;
4use crate::error::PluginError;
5use crate::install::plugin_id;
6use crate::manifest::load_plugin_from_directory;
7use crate::resolve::{resolve_hooks, resolve_lifecycle, resolve_tools};
8use crate::types::{
9    BuiltinPlugin, BundledPlugin, ExternalPlugin, PluginDefinition, PluginHooks, PluginKind,
10    PluginLifecycle, PluginMetadata,
11};
12
13#[must_use]
14pub fn builtin_plugins() -> Vec<PluginDefinition> {
15    vec![PluginDefinition::Builtin(BuiltinPlugin {
16        metadata: PluginMetadata {
17            id: plugin_id("example-builtin", BUILTIN_MARKETPLACE),
18            name: "example-builtin".to_string(),
19            version: "0.1.0".to_string(),
20            description: "Example built-in plugin scaffold for the Rust plugin system".to_string(),
21            kind: PluginKind::Builtin,
22            source: BUILTIN_MARKETPLACE.to_string(),
23            default_enabled: false,
24            root: None,
25        },
26        hooks: PluginHooks::default(),
27        lifecycle: PluginLifecycle::default(),
28        tools: Vec::new(),
29    })]
30}
31
32pub(crate) fn load_plugin_definition(
33    root: &Path,
34    kind: PluginKind,
35    source: String,
36    marketplace: &str,
37) -> Result<PluginDefinition, PluginError> {
38    let manifest = load_plugin_from_directory(root)?;
39    let metadata = PluginMetadata {
40        id: plugin_id(&manifest.name, marketplace),
41        name: manifest.name,
42        version: manifest.version,
43        description: manifest.description,
44        kind,
45        source,
46        default_enabled: manifest.default_enabled,
47        root: Some(root.to_path_buf()),
48    };
49    let hooks = resolve_hooks(root, &manifest.hooks);
50    let lifecycle = resolve_lifecycle(root, &manifest.lifecycle);
51    let tools = resolve_tools(root, &metadata.id, &metadata.name, &manifest.tools);
52    Ok(match kind {
53        PluginKind::Builtin => PluginDefinition::Builtin(BuiltinPlugin {
54            metadata,
55            hooks,
56            lifecycle,
57            tools,
58        }),
59        PluginKind::Bundled => PluginDefinition::Bundled(BundledPlugin {
60            metadata,
61            hooks,
62            lifecycle,
63            tools,
64        }),
65        PluginKind::External => PluginDefinition::External(ExternalPlugin {
66            metadata,
67            hooks,
68            lifecycle,
69            tools,
70        }),
71    })
72}