Skip to main content

Mountain/RPC/CocoonService/TreeView/
GetTreeChildren.rs

1//! Round-trip a `getChildren` request to the Cocoon-side
2//! `TreeDataProvider` over Vine. Returns an empty list when no provider
3//! is registered or the sidecar call times out (5 s default).
4
5use serde_json::{Value, json};
6use tonic::{Response, Status};
7use ::Vine::{
8	Client::SendRequest::Fn as SendRequest,
9	Generated::{GetTreeChildrenRequest, GetTreeChildrenResponse, TreeItem},
10};
11
12use crate::{
13	RPC::CocoonService::{CocoonServiceImpl, TreeView::ViewIdHandle},
14	dev_log,
15};
16
17pub async fn Fn(
18	Service:&CocoonServiceImpl,
19
20	Request:GetTreeChildrenRequest,
21) -> Result<Response<GetTreeChildrenResponse>, Status> {
22	dev_log!("cocoon", "[CocoonService] get_tree_children: view={}", Request.view_id);
23
24	let Handle = ViewIdHandle::Fn(&Request.view_id);
25
26	let Provider = Service
27		.environment
28		.ApplicationState
29		.Extension
30		.ProviderRegistration
31		.GetProvider(Handle);
32
33	if Provider.is_none() {
34		dev_log!(
35			"tree-view",
36			"[TreeView] get-children view={} parent_handle={} - no provider registered",
37			Request.view_id,
38			Request.tree_item_handle
39		);
40
41		return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
42	}
43
44	dev_log!(
45		"tree-view",
46		"[TreeView] get-children view={} parent_handle={} - forwarding to Cocoon $provideTreeChildren",
47		Request.view_id,
48		Request.tree_item_handle
49	);
50
51	let Parameters = json!({
52		"viewId": Request.view_id,
53		"treeItemHandle": Request.tree_item_handle,
54		"handle": Handle,
55	});
56
57	// 15 s timeout: matches the Wind path. Cold tree-view scans on a
58	// multi-repo workspace (npm, gitlens) can exceed 5 s on first
59	// expansion. Empty response is returned on real hang so callers
60	// don't lock.
61	let Reply = match SendRequest("cocoon-main", "$provideTreeChildren".to_string(), Parameters, 15000).await {
62		Ok(Value_) => Value_,
63
64		Err(Error) => {
65			dev_log!(
66				"tree-view",
67				"[TreeView] get-children view={} error forwarding to Cocoon: {:?}",
68				Request.view_id,
69				Error
70			);
71
72			return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
73		},
74	};
75
76	let Items = Reply
77		.get("items")
78		.and_then(Value::as_array)
79		.cloned()
80		.unwrap_or_default()
81		.into_iter()
82		.map(|Item| {
83			let Handle = Item.get("handle").and_then(Value::as_str).unwrap_or("").to_string();
84
85			let Label = Item.get("label").and_then(Value::as_str).unwrap_or("").to_string();
86
87			let IsCollapsed = Item.get("isCollapsed").and_then(Value::as_bool).unwrap_or(false);
88
89			let Icon = Item.get("icon").and_then(Value::as_str).unwrap_or("").to_string();
90
91			TreeItem { handle:Handle, label:Label, is_collapsed:IsCollapsed, icon:Icon }
92		})
93		.collect::<Vec<TreeItem>>();
94
95	dev_log!(
96		"tree-view",
97		"[TreeView] get-children view={} parent_handle={} children={}",
98		Request.view_id,
99		Request.tree_item_handle,
100		Items.len()
101	);
102
103	Ok(Response::new(GetTreeChildrenResponse { items:Items }))
104}