Skip to main content

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