Skip to main content

Mountain/RPC/CocoonService/SCM/
UpdateScmGroup.rs

1//! Forward resource-state updates from the Vine gRPC notification to Sky.
2//! Group label/metadata is already stored from register_scm_resource_group.
3
4use serde_json::json;
5use tauri::Emitter;
6use tonic::{Response, Status};
7use ::Vine::Generated::{Empty, UpdateScmGroupRequest};
8
9use crate::{RPC::CocoonService::CocoonServiceImpl, dev_log};
10
11pub async fn Fn(Service:&CocoonServiceImpl, Request:UpdateScmGroupRequest) -> Result<Response<Empty>, Status> {
12	dev_log!(
13		"cocoon",
14		"[CocoonService] update_scm_group: provider={} group={}",
15		Request.provider_id,
16		Request.group_id
17	);
18
19	let ResourceStates:Vec<serde_json::Value> = Request
20		.resource_states
21		.iter()
22		.map(|RS| {
23			json!({
24				"uri": RS.uri.as_ref().map(|U| U.value.as_str()).unwrap_or(""),
25				"decorations": RS.decorations,
26			})
27		})
28		.collect();
29
30	// update_scm_group carries resource states, not group metadata.
31	// Emit directly to Sky so the SCM panel shows changed files.
32	// scmId + providerId both set so Sky's ResolveScmShim finds the shim.
33	let _ = Service.environment.ApplicationHandle.emit(
34		"sky://scm/updateGroup",
35		json!({
36			"scmId": Request.provider_id,
37			"providerId": Request.provider_id,
38			"groupId": Request.group_id,
39			"resourceStates": ResourceStates,
40		}),
41	);
42
43	Ok(Response::new(Empty {}))
44}