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	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}