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