Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_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};
7
8use crate::{
9	RPC::CocoonService::{CocoonServiceImpl, TreeView::ViewIdHandle},
10	Vine::{
11		Client::SendRequest::Fn as SendRequest,
12		Generated::{GetTreeChildrenRequest, GetTreeChildrenResponse, TreeItem},
13	},
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	let Reply = match SendRequest("cocoon-main", "$provideTreeChildren".to_string(), Parameters, 5000).await {
58		Ok(Value_) => Value_,
59
60		Err(Error) => {
61			dev_log!(
62				"tree-view",
63				"[TreeView] get-children view={} error forwarding to Cocoon: {:?}",
64				Request.view_id,
65				Error
66			);
67
68			return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
69		},
70	};
71
72	let Items = Reply
73		.get("items")
74		.and_then(Value::as_array)
75		.cloned()
76		.unwrap_or_default()
77		.into_iter()
78		.map(|Item| {
79			let Handle = Item.get("handle").and_then(Value::as_str).unwrap_or("").to_string();
80			let Label = Item.get("label").and_then(Value::as_str).unwrap_or("").to_string();
81			let IsCollapsed = Item.get("isCollapsed").and_then(Value::as_bool).unwrap_or(false);
82			let Icon = Item.get("icon").and_then(Value::as_str).unwrap_or("").to_string();
83			TreeItem { handle:Handle, label:Label, is_collapsed:IsCollapsed, icon:Icon }
84		})
85		.collect::<Vec<TreeItem>>();
86
87	dev_log!(
88		"tree-view",
89		"[TreeView] get-children view={} parent_handle={} children={}",
90		Request.view_id,
91		Request.tree_item_handle,
92		Items.len()
93	);
94
95	Ok(Response::new(GetTreeChildrenResponse { items:Items }))
96}