codetether_agent/plugin_marketplace/
registry.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct PluginEntry {
8 pub name: String,
9 pub version: String,
10 pub description: String,
11 pub author: String,
12 pub sha256: String,
13 pub signature: String,
14 pub download_url: String,
15 pub capabilities: Vec<String>,
16 pub downloads: u64,
17 pub rating: f32,
18 pub repo_url: Option<String>,
19}
20
21pub fn search_plugins<'a>(query: &str, plugins: &'a [PluginEntry]) -> Vec<&'a PluginEntry> {
23 let lower = query.to_lowercase();
24 plugins
25 .iter()
26 .filter(|p| {
27 p.name.to_lowercase().contains(&lower)
28 || p.description.to_lowercase().contains(&lower)
29 || p.capabilities
30 .iter()
31 .any(|c| c.to_lowercase().contains(&lower))
32 })
33 .collect()
34}
35
36pub fn by_popularity(plugins: &mut [&PluginEntry]) {
38 plugins.sort_by(|a, b| {
39 let score_a = a.downloads as f32 * a.rating;
40 let score_b = b.downloads as f32 * b.rating;
41 score_b.total_cmp(&score_a)
42 });
43}