codineer_plugins/
definition.rs1use 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}