Mountain/RPC/CocoonService/TreeView/
GetTreeChildren.rs1use 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 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}