Mountain/RPC/CocoonService/Window/
ShowQuickPick.rs1use tonic::{Response, Status};
6use CommonLibrary::UserInterface::{
7 DTO::{QuickPickItemDTO::QuickPickItemDTO, QuickPickOptionsDTO::QuickPickOptionsDTO},
8 UserInterfaceProvider::UserInterfaceProvider,
9};
10use ::Vine::Generated::{ShowQuickPickRequest, ShowQuickPickResponse};
11
12use crate::{RPC::CocoonService::CocoonServiceImpl, dev_log};
13
14pub async fn Fn(
15 Service:&CocoonServiceImpl,
16
17 Request:ShowQuickPickRequest,
18) -> Result<Response<ShowQuickPickResponse>, Status> {
19 dev_log!("cocoon", "[CocoonService] show_quick_pick: {} items", Request.items.len());
20
21 let Items:Vec<QuickPickItemDTO> = Request
22 .items
23 .iter()
24 .map(|Item| {
25 QuickPickItemDTO {
26 Label:Item.label.clone(),
27 Description:if Item.description.is_empty() { None } else { Some(Item.description.clone()) },
28 Detail:None,
29 Picked:Some(Item.picked),
30 AlwaysShow:None,
31 }
32 })
33 .collect();
34
35 let Options = Some(QuickPickOptionsDTO {
36 Title:if Request.title.is_empty() { None } else { Some(Request.title.clone()) },
37 PlaceHolder:if Request.placeholder.is_empty() {
38 None
39 } else {
40 Some(Request.placeholder.clone())
41 },
42 CanPickMany:Some(Request.can_pick_many),
43 IgnoreFocusOut:None,
44 });
45
46 match Service.environment.ShowQuickPick(Items, Options).await {
47 Ok(Some(Selected)) => {
48 let SelectedIndices:Vec<u32> = Selected
49 .iter()
50 .filter_map(|Label| {
51 Request
52 .items
53 .iter()
54 .position(|Item| &Item.label == Label)
55 .map(|Index| Index as u32)
56 })
57 .collect();
58
59 Ok(Response::new(ShowQuickPickResponse { selected_indices:SelectedIndices }))
60 },
61
62 Ok(None) => Ok(Response::new(ShowQuickPickResponse::default())),
63
64 Err(Error) => {
65 dev_log!("cocoon", "warn: [CocoonService] show_quick_pick failed: {}", Error);
66
67 Ok(Response::new(ShowQuickPickResponse::default()))
68 },
69 }
70}