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