Skip to main content

Mountain/RPC/CocoonService/Window/
ShowQuickPick.rs

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