Mountain/RPC/CocoonService/TreeView/
GetTreeChildren.rs1#![allow(non_snake_case)]
2
3use 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}