DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RPC/CocoonService/TreeView/
GetTreeChildren.rs1use serde_json::{Value, json};
6use tonic::{Response, Status};
7
8use crate::{
9 RPC::CocoonService::{CocoonServiceImpl, TreeView::ViewIdHandle},
10 Vine::{
11 Client::SendRequest::Fn as SendRequest,
12 Generated::{GetTreeChildrenRequest, GetTreeChildrenResponse, TreeItem},
13 },
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, 5000).await {
58 Ok(Value_) => Value_,
59
60 Err(Error) => {
61 dev_log!(
62 "tree-view",
63 "[TreeView] get-children view={} error forwarding to Cocoon: {:?}",
64 Request.view_id,
65 Error
66 );
67
68 return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
69 },
70 };
71
72 let Items = Reply
73 .get("items")
74 .and_then(Value::as_array)
75 .cloned()
76 .unwrap_or_default()
77 .into_iter()
78 .map(|Item| {
79 let Handle = Item.get("handle").and_then(Value::as_str).unwrap_or("").to_string();
80 let Label = Item.get("label").and_then(Value::as_str).unwrap_or("").to_string();
81 let IsCollapsed = Item.get("isCollapsed").and_then(Value::as_bool).unwrap_or(false);
82 let Icon = Item.get("icon").and_then(Value::as_str).unwrap_or("").to_string();
83 TreeItem { handle:Handle, label:Label, is_collapsed:IsCollapsed, icon:Icon }
84 })
85 .collect::<Vec<TreeItem>>();
86
87 dev_log!(
88 "tree-view",
89 "[TreeView] get-children view={} parent_handle={} children={}",
90 Request.view_id,
91 Request.tree_item_handle,
92 Items.len()
93 );
94
95 Ok(Response::new(GetTreeChildrenResponse { items:Items }))
96}