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 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 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 return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
41 }
42
43 dev_log!(
44 "tree-view",
45 "[TreeView] get-children view={} parent_handle={} - forwarding to Cocoon $provideTreeChildren",
46 Request.view_id,
47 Request.tree_item_handle
48 );
49
50 let Parameters = json!({
51 "viewId": Request.view_id,
52 "treeItemHandle": Request.tree_item_handle,
53 "handle": Handle,
54 });
55
56 let Reply = match SendRequest("cocoon-main", "$provideTreeChildren".to_string(), Parameters, 5000).await {
57 Ok(Value_) => Value_,
58 Err(Error) => {
59 dev_log!(
60 "tree-view",
61 "[TreeView] get-children view={} error forwarding to Cocoon: {:?}",
62 Request.view_id,
63 Error
64 );
65 return Ok(Response::new(GetTreeChildrenResponse { items:Vec::new() }));
66 },
67 };
68
69 let Items = Reply
70 .get("items")
71 .and_then(Value::as_array)
72 .cloned()
73 .unwrap_or_default()
74 .into_iter()
75 .map(|Item| {
76 let Handle = Item.get("handle").and_then(Value::as_str).unwrap_or("").to_string();
77 let Label = Item.get("label").and_then(Value::as_str).unwrap_or("").to_string();
78 let IsCollapsed = Item.get("isCollapsed").and_then(Value::as_bool).unwrap_or(false);
79 let Icon = Item.get("icon").and_then(Value::as_str).unwrap_or("").to_string();
80 TreeItem { handle:Handle, label:Label, is_collapsed:IsCollapsed, icon:Icon }
81 })
82 .collect::<Vec<TreeItem>>();
83
84 dev_log!(
85 "tree-view",
86 "[TreeView] get-children view={} parent_handle={} children={}",
87 Request.view_id,
88 Request.tree_item_handle,
89 Items.len()
90 );
91
92 Ok(Response::new(GetTreeChildrenResponse { items:Items }))
93}