Skip to main content

Mountain/IPC/WindServiceHandler/
Extension.rs

1#![allow(non_snake_case)]
2
3//! Extension host domain handlers for Wind IPC.
4
5use std::sync::Arc;
6
7use serde_json::{Value, json};
8use CommonLibrary::ExtensionManagement::ExtensionManagementService::ExtensionManagementService;
9
10use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, dev_log};
11
12/// Return metadata for all scanned extensions.
13pub async fn handle_extensions_get_all(Runtime:Arc<ApplicationRunTime>) -> Result<Value, String> {
14	let Extensions = Runtime
15		.Environment
16		.GetExtensions()
17		.await
18		.map_err(|Error| format!("extensions:getAll failed: {}", Error))?;
19
20	let ExtensionCount = Extensions.len();
21	let Response = json!(Extensions);
22	let PayloadBytes = serde_json::to_string(&Response).map(|S| S.len()).unwrap_or(0);
23
24	dev_log!(
25		"extensions",
26		"extensions:getAll returning {} extensions ({} bytes serialized)",
27		ExtensionCount,
28		PayloadBytes
29	);
30	if let Some(First) = Extensions.first() {
31		dev_log!(
32			"extensions",
33			"extensions:getAll sample: {}",
34			serde_json::to_string(First)
35				.unwrap_or_default()
36				.chars()
37				.take(300)
38				.collect::<String>()
39		);
40	} else if ExtensionCount == 0 {
41		dev_log!(
42			"extensions",
43			"warn: extensions:getAll returning EMPTY — scan has not populated ScannedExtensions, or all inserts were \
44			 rejected"
45		);
46	}
47	Ok(Response)
48}
49
50/// Return metadata for a single extension by ID.
51pub async fn handle_extensions_get(Runtime:Arc<ApplicationRunTime>, Args:Vec<Value>) -> Result<Value, String> {
52	let Id = Args
53		.first()
54		.and_then(|V| V.as_str())
55		.ok_or_else(|| "extensions:get requires string id as first argument".to_string())?
56		.to_string();
57
58	let Extension = Runtime
59		.Environment
60		.GetExtension(Id)
61		.await
62		.map_err(|Error| format!("extensions:get failed: {}", Error))?;
63
64	Ok(Extension.unwrap_or(Value::Null))
65}
66
67/// Check whether an extension is currently active (scanned and present).
68pub async fn handle_extensions_is_active(Runtime:Arc<ApplicationRunTime>, Args:Vec<Value>) -> Result<Value, String> {
69	let Id = Args
70		.first()
71		.and_then(|V| V.as_str())
72		.ok_or_else(|| "extensions:isActive requires string id as first argument".to_string())?
73		.to_string();
74
75	let Extension = Runtime
76		.Environment
77		.GetExtension(Id)
78		.await
79		.map_err(|Error| format!("extensions:isActive failed: {}", Error))?;
80
81	Ok(json!(Extension.is_some()))
82}