vs_core/service/
current.rs1use crate::{App, CoreError, CurrentTool};
2
3impl App {
4 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 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 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}