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
22	Request:GetTreeChildrenRequest,
23) -> Result<Response<GetTreeChildrenResponse>, Status> {
24	dev_log!("cocoon", "[CocoonService] get_tree_children: view={}", Request.view_id);
25
26	let Handle = ViewIdHandle::Fn(&Request.view_id);
27
28	let Provider = Service
29		.environment
30		.ApplicationState
31		.Extension
32		.ProviderRegistration
33		.GetProvider(Handle);
34
35	if Provider.is_none() {
36		dev_log!(
37			"tree-view",
38			"[TreeView] get-children view={} parent_handle={} - no provider registered",
39			Request.view_id,
40			Request.tree_item_handle
41		);
42
43		return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
44	}
45
46	dev_log!(
47		"tree-view",
48		"[TreeView] get-children view={} parent_handle={} - forwarding to Cocoon $provideTreeChildren",
49		Request.view_id,
50		Request.tree_item_handle
51	);
52
53	let Parameters = json!({
54		"viewId": Request.view_id,
55		"treeItemHandle": Request.tree_item_handle,
56		"handle": Handle,
57	});
58
59	let Reply = match SendRequest("cocoon-main", "$provideTreeChildren".to_string(), Parameters, 5000).await {
60		Ok(Value_) => Value_,
61
62		Err(Error) => {
63			dev_log!(
64				"tree-view",
65				"[TreeView] get-children view={} error forwarding to Cocoon: {:?}",
66				Request.view_id,
67				Error
68			);
69
70			return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
71		},
72	};
73
74	let Items = Reply
75		.get("items")
76		.and_then(Value::as_array)
77		.cloned()
78		.unwrap_or_default()
79		.into_iter()
80		.map(|Item| {
81			let Handle = Item.get("handle").and_then(Value::as_str).unwrap_or("").to_string();
82			let Label = Item.get("label").and_then(Value::as_str).unwrap_or("").to_string();
83			let IsCollapsed = Item.get("isCollapsed").and_then(Value::as_bool).unwrap_or(false);
84			let Icon = Item.get("icon").and_then(Value::as_str).unwrap_or("").to_string();
85			TreeItem { handle:Handle, label:Label, is_collapsed:IsCollapsed, icon:Icon }
86		})
87		.collect::<Vec<TreeItem>>();
88
89	dev_log!(
90		"tree-view",
91		"[TreeView] get-children view={} parent_handle={} children={}",
92		Request.view_id,
93		Request.tree_item_handle,
94		Items.len()
95	);
96
97	Ok(Response::new(GetTreeChildrenResponse { items:Items }))
98}