Skip to main content

Mountain/RPC/CocoonService/TreeView/
GetTreeChildren.rs

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