Files
YMhut-box-C-/server/unified-management/web/wasm/src/lib.rs
T
QWQLwToo 079ee4eaeb
build-winui / winui (push) Has been cancelled
Add server components
2026-06-26 13:28:09 +08:00

97 lines
3.2 KiB
Rust

use serde_json::{json, Value};
use wasm_bindgen::prelude::*;
#[wasm_bindgen(js_name = compareVersions)]
pub fn compare_versions(a: &str, b: &str) -> i32 {
let mut av = parse_version(a);
let mut bv = parse_version(b);
av.resize(4, 0);
bv.resize(4, 0);
for index in 0..4 {
if av[index] > bv[index] {
return 1;
}
if av[index] < bv[index] {
return -1;
}
}
0
}
#[wasm_bindgen(js_name = scoreEndpointHealth)]
pub fn score_endpoint_health(status: &str, latency_ms: i32, failures: i32) -> i32 {
let base = match status {
"ok" => 100,
"degraded" => 70,
"error" => 30,
_ => 50,
};
let latency_penalty = (latency_ms / 250).clamp(0, 30);
let failure_penalty = (failures * 12).clamp(0, 48);
(base - latency_penalty - failure_penalty).clamp(0, 100)
}
#[wasm_bindgen(js_name = normalizeReleaseManifest)]
pub fn normalize_release_manifest(input: &str) -> String {
let mut value: Value = serde_json::from_str(input).unwrap_or_else(|_| json!({}));
if value.get("manifest_version").is_none() {
value["manifest_version"] = json!(2);
}
if value.get("packages").is_none() {
value["packages"] = json!([]);
}
serde_json::to_string(&value).unwrap_or_else(|_| "{}".to_string())
}
#[wasm_bindgen(js_name = validateSourceCatalog)]
pub fn validate_source_catalog(input: &str) -> String {
let value: Value = serde_json::from_str(input).unwrap_or_else(|_| json!({}));
let categories = value
.get("categories")
.and_then(|item| item.as_array())
.map(|items| items.len())
.unwrap_or_default();
let mut source_count = 0usize;
if let Some(items) = value.get("categories").and_then(|item| item.as_array()) {
for category in items {
source_count += category
.get("subcategories")
.and_then(|item| item.as_array())
.map(|items| items.len())
.unwrap_or_default();
}
}
serde_json::to_string(&json!({
"ok": categories > 0,
"categories": categories,
"sources": source_count
})).unwrap_or_else(|_| "{\"ok\":false}".to_string())
}
#[wasm_bindgen(js_name = mergeLegacyMediaTypes)]
pub fn merge_legacy_media_types(current: &str, legacy: &str) -> String {
let current_value: Value = serde_json::from_str(current).unwrap_or_else(|_| json!({"categories":[]}));
let legacy_value: Value = serde_json::from_str(legacy).unwrap_or_else(|_| json!({"categories":[]}));
let mut categories = current_value
.get("categories")
.and_then(|item| item.as_array())
.cloned()
.unwrap_or_default();
if let Some(legacy_categories) = legacy_value.get("categories").and_then(|item| item.as_array()) {
for category in legacy_categories {
categories.push(category.clone());
}
}
serde_json::to_string(&json!({
"layout_version": "2.0.0",
"categories": categories
})).unwrap_or_else(|_| "{\"categories\":[]}".to_string())
}
fn parse_version(value: &str) -> Vec<i32> {
value
.split('.')
.map(|part| part.parse::<i32>().unwrap_or_default())
.collect()
}