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
22 Request:ShowQuickPickRequest,
23) -> Result<Response<ShowQuickPickResponse>, Status> {
24 dev_log!("cocoon", "[CocoonService] show_quick_pick: {} items", Request.items.len());
25
26 let Items:Vec<QuickPickItemDTO> = Request
27 .items
28 .iter()
29 .map(|Item| {
30 QuickPickItemDTO {
31 Label:Item.label.clone(),
32 Description:if Item.description.is_empty() { None } else { Some(Item.description.clone()) },
33 Detail:None,
34 Picked:Some(Item.picked),
35 AlwaysShow:None,
36 }
37 })
38 .collect();
39
40 let Options = Some(QuickPickOptionsDTO {
41 Title:if Request.title.is_empty() { None } else { Some(Request.title.clone()) },
42 PlaceHolder:if Request.placeholder.is_empty() {
43 None
44 } else {
45 Some(Request.placeholder.clone())
46 },
47 CanPickMany:Some(Request.can_pick_many),
48 IgnoreFocusOut:None,
49 });
50
51 match Service.environment.ShowQuickPick(Items, Options).await {
52 Ok(Some(Selected)) => {
53 let SelectedIndices:Vec<u32> = Selected
54 .iter()
55 .filter_map(|Label| {
56 Request
57 .items
58 .iter()
59 .position(|Item| &Item.label == Label)
60 .map(|Index| Index as u32)
61 })
62 .collect();
63
64 Ok(Response::new(ShowQuickPickResponse { selected_indices:SelectedIndices }))
65 },
66
67 Ok(None) => Ok(Response::new(ShowQuickPickResponse::default())),
68
69 Err(Error) => {
70 dev_log!("cocoon", "warn: [CocoonService] show_quick_pick failed: {}", Error);
71
72 Ok(Response::new(ShowQuickPickResponse::default()))
73 },
74 }
75}