Skip to main content

Mountain/RPC/CocoonService/Window/
ShowQuickPick.rs

1#![allow(non_snake_case)]
2
3//! Display a quick-pick UI through the `UserInterfaceProvider`. The
4//! returned label strings are mapped back to indices via linear search
5//! so the proto response can carry stable `selected_indices`.
6
7use 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}