Skip to main content

Mountain/RPC/CocoonService/TreeView/
GetTreeChildren.rs

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