Mountain/Vine/Server/Notification/
UpdateScmGroup.rs1use serde_json::{Value, json};
25use tauri::Emitter;
26
27use crate::{Vine::Server::MountainVinegRPCService::MountainVinegRPCService, dev_log};
28
29pub async fn UpdateScmGroup(Service:&MountainVinegRPCService, Parameter:&Value) {
30 let ScmHandle = Parameter
33 .get("scmHandle")
34 .or_else(|| Parameter.get("scm_handle"))
35 .and_then(Value::as_u64)
36 .map(|H| H as u32);
37
38 let GroupHandle = Parameter
39 .get("groupHandle")
40 .or_else(|| Parameter.get("group_handle"))
41 .and_then(Value::as_str)
42 .unwrap_or("")
43 .to_string();
44
45 let LegacyProviderId = Parameter
49 .get("providerId")
50 .or_else(|| Parameter.get("provider_id"))
51 .and_then(Value::as_str)
52 .unwrap_or("")
53 .to_string();
54
55 let LegacyGroupId = Parameter
56 .get("groupId")
57 .or_else(|| Parameter.get("group_id"))
58 .and_then(Value::as_str)
59 .unwrap_or("")
60 .to_string();
61
62 let ResourceStates = Parameter
63 .get("resourceStates")
64 .or_else(|| Parameter.get("resource_states"))
65 .cloned()
66 .unwrap_or_else(|| Value::Array(Vec::new()));
67
68 let (HandleFromString, GroupIdFromHandle) = match GroupHandle.split_once('/') {
73 Some((H, G)) => (H.parse::<u32>().ok(), G.to_string()),
74
75 None => (None, String::new()),
76 };
77
78 let ResolvedScmHandle = ScmHandle.or(HandleFromString);
79
80 let ResolvedGroupId = if !GroupIdFromHandle.is_empty() {
81 GroupIdFromHandle
82 } else if !LegacyGroupId.is_empty() {
83 LegacyGroupId
84 } else {
85 String::new()
86 };
87
88 if ResolvedScmHandle.is_none() && LegacyProviderId.is_empty() {
89 dev_log!(
90 "grpc",
91 "[ScmGroup] skip: missing scm_handle / provider_id (group_handle={:?} legacy_group={:?})",
92 GroupHandle,
93 ResolvedGroupId
94 );
95
96 return;
97 }
98
99 if ResolvedGroupId.is_empty() {
100 dev_log!(
101 "grpc",
102 "[ScmGroup] skip: missing group_id (scm_handle={:?} group_handle={:?})",
103 ResolvedScmHandle,
104 GroupHandle
105 );
106
107 return;
108 }
109
110 let _ = Service.ApplicationHandle().emit(
111 "sky://scm/updateGroup",
112 json!({
113 "scmHandle": ResolvedScmHandle,
114 "providerId": &LegacyProviderId,
115 "groupHandle": &GroupHandle,
116 "groupId": &ResolvedGroupId,
117 "resourceStates": ResourceStates,
118 }),
119 );
120
121 dev_log!(
122 "grpc",
123 "[ScmGroup] scm_handle={:?} group={} resources={}",
124 ResolvedScmHandle,
125 ResolvedGroupId,
126 ResourceStates.as_array().map(Vec::len).unwrap_or(0)
127 );
128}