Mountain/Track/Effect/CreateEffectForRequest/
Languages.rs1#![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}