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