Skip to main content

Mountain/Track/Effect/CreateEffectForRequest/
Languages.rs

1#![allow(non_snake_case, unused_variables, dead_code, unused_imports)]
2
3use std::{collections::HashMap, future::Future, pin::Pin, sync::Arc};
4
5use serde_json::{Value, json};
6use tauri::Runtime;
7
8use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, Track::Effect::MappedEffectType::MappedEffect, dev_log};
9
10pub fn CreateEffect<R:Runtime>(MethodName:&str, Parameters:Value) -> Option<Result<MappedEffect, String>> {
11	match MethodName {
12		"Languages.GetAll" => {
13			let effect =
14				move |run_time:Arc<ApplicationRunTime>| -> Pin<Box<dyn Future<Output = Result<Value, String>> + Send>> {
15					Box::pin(async move {
16						let scanned = run_time
17							.Environment
18							.ApplicationState
19							.Extension
20							.ScannedExtensions
21							.ScannedExtensions
22							.clone();
23						let Guard = match scanned.lock() {
24							Ok(g) => g,
25							Err(error) => {
26								return Err(format!("Languages.GetAll: scanned-extensions lock poisoned: {}", error));
27							},
28						};
29
30						let mut merged:HashMap<String, serde_json::Map<String, Value>> = HashMap::new();
31						for Dto in Guard.values() {
32							let Contributes = match Dto.Contributes.as_ref() {
33								Some(c) => c,
34								None => continue,
35							};
36							let Languages = Contributes.get("languages").and_then(Value::as_array);
37							let Some(Languages) = Languages else { continue };
38							for Entry in Languages {
39								let Id = match Entry.get("id").and_then(Value::as_str) {
40									Some(id) if !id.is_empty() => id.to_string(),
41									_ => continue,
42								};
43								let Existing = merged.entry(Id.clone()).or_insert_with(|| {
44									let mut seed = serde_json::Map::new();
45									seed.insert("id".to_string(), json!(Id));
46									seed.insert("aliases".to_string(), json!([]));
47									seed.insert("extensions".to_string(), json!([]));
48									seed.insert("filenames".to_string(), json!([]));
49									seed.insert("filenamePatterns".to_string(), json!([]));
50									seed.insert("mimetypes".to_string(), json!([]));
51									seed.insert("configuration".to_string(), Value::Null);
52									seed
53								});
54								let merge_array =
55									|target:&mut serde_json::Map<String, Value>, key:&str, incoming:&Value| {
56										let Some(incoming_arr) = incoming.get(key).and_then(Value::as_array) else {
57											return;
58										};
59										let bucket = target.entry(key.to_string()).or_insert_with(|| json!([]));
60										if let Some(bucket_arr) = bucket.as_array_mut() {
61											for v in incoming_arr {
62												if !bucket_arr.iter().any(|e| e == v) {
63													bucket_arr.push(v.clone());
64												}
65											}
66										}
67									};
68								merge_array(Existing, "aliases", Entry);
69								merge_array(Existing, "extensions", Entry);
70								merge_array(Existing, "filenames", Entry);
71								merge_array(Existing, "filenamePatterns", Entry);
72								merge_array(Existing, "mimetypes", Entry);
73								if Existing.get("configuration").map(Value::is_null).unwrap_or(true) {
74									if let Some(cfg) = Entry.get("configuration") {
75										Existing.insert("configuration".to_string(), cfg.clone());
76									}
77								}
78							}
79						}
80						drop(Guard);
81
82						let result:Vec<Value> = merged.into_values().map(Value::Object).collect();
83						dev_log!("ipc", "[Languages.GetAll] returning {} languages", result.len());
84						Ok(json!(result))
85					})
86				};
87			Some(Ok(Box::new(effect)))
88		},
89
90		_ => None,
91	}
92}