Skip to main content

vs_core/service/
current.rs

1use crate::{App, CoreError, CurrentTool};
2
3impl App {
4    /// Resolves the active version for a specific plugin.
5    pub fn current_tool(&self, plugin_name: &str) -> Result<Option<CurrentTool>, CoreError> {
6        let resolved = vs_config::resolve_tool_version(
7            self.home(),
8            &self.cwd,
9            self.session_id.as_deref(),
10            plugin_name,
11        )?;
12        let Some(resolved) = resolved else {
13            return Ok(None);
14        };
15        if self
16            .load_installed_runtime(&resolved.plugin, &resolved.version)?
17            .is_none()
18        {
19            return Ok(None);
20        }
21        Ok(Some(CurrentTool {
22            plugin: resolved.plugin,
23            version: resolved.version,
24            scope: resolved.scope,
25            source: resolved.source,
26        }))
27    }
28
29    /// Resolves all active tools for the current context.
30    pub fn current_tools(&self) -> Result<Vec<CurrentTool>, CoreError> {
31        let mut current = Vec::new();
32        for configured in self.collect_current_tools()? {
33            if self
34                .load_installed_runtime(&configured.plugin, &configured.version)?
35                .is_some()
36            {
37                current.push(configured);
38            }
39        }
40        Ok(current)
41    }
42
43    /// Returns all known plugins with their current version when available.
44    pub fn current_tool_statuses(&self) -> Result<Vec<(String, Option<String>)>, CoreError> {
45        let mut names = self
46            .added_plugins()?
47            .into_iter()
48            .map(|entry| entry.name)
49            .collect::<std::collections::BTreeSet<_>>();
50        names.extend(
51            self.list_installed_versions()?
52                .into_iter()
53                .map(|installed| installed.plugin),
54        );
55
56        let mut statuses = Vec::new();
57        for plugin in names {
58            let current = self.current_tool(&plugin)?;
59            statuses.push((plugin, current.map(|tool| tool.version)));
60        }
61        Ok(statuses)
62    }
63}