Skip to main content

Mountain/RPC/CocoonService/SCM/
RegisterScmProvider.rs

1#![allow(non_snake_case)]
2
3//! Register a Cocoon SCM provider in `ApplicationState` AND route through
4//! the `SourceControlManagementProvider` trait so SCM state is materialised
5//! in `ApplicationState::SourceControl` (the surface Sky's SCM view binds
6//! to). The prior direct Sky emit bypassed state tracking - providers
7//! registered by gitlens/svn/etc. never appeared in the SCM view until a
8//! `UpdateScmGroup` call landed.
9
10use serde_json::json;
11use tauri::Emitter;
12use tonic::{Response, Status};
13use CommonLibrary::{
14	LanguageFeature::DTO::ProviderType::ProviderType,
15	SourceControlManagement::SourceControlManagementProvider::SourceControlManagementProvider,
16};
17
18use crate::{
19	ApplicationState::DTO::ProviderRegistrationDTO::ProviderRegistrationDTO,
20	RPC::CocoonService::CocoonServiceImpl,
21	Vine::Generated::{Empty, RegisterScmProviderRequest},
22	dev_log,
23};
24
25pub async fn Fn(Service:&CocoonServiceImpl, Request:RegisterScmProviderRequest) -> Result<Response<Empty>, Status> {
26	dev_log!("cocoon", "[CocoonService] Registering SCM provider: {}", Request.scm_id);
27
28	let Handle = Request
29		.scm_id
30		.as_bytes()
31		.iter()
32		.fold(0u32, |Acc, B| Acc.wrapping_mul(31).wrapping_add(*B as u32));
33	let DTO = ProviderRegistrationDTO {
34		Handle,
35		ProviderType:ProviderType::SourceControl,
36		Selector:json!([{ "scmId": Request.scm_id }]),
37		SideCarIdentifier:"cocoon-main".to_string(),
38		ExtensionIdentifier:json!(Request.extension_id),
39		Options:Some(json!({ "scmId": Request.scm_id })),
40	};
41	Service
42		.environment
43		.ApplicationState
44		.Extension
45		.ProviderRegistration
46		.RegisterProvider(Handle, DTO);
47
48	let CreateData = json!({
49		"handle": Handle,
50		"id": Request.scm_id,
51		"label": Request.scm_id,
52		"rootUri": null,
53		"extensionId": Request.extension_id,
54	});
55	if let Err(Error) = Service.environment.CreateSourceControl(CreateData).await {
56		dev_log!(
57			"cocoon",
58			"warn: [CocoonService] CreateSourceControl trait failed ({}); falling back to Sky emit",
59			Error
60		);
61		let _ = Service.environment.ApplicationHandle.emit(
62			"sky://scm/register",
63			json!({ "scmId": Request.scm_id, "extensionId": Request.extension_id }),
64		);
65	}
66
67	Ok(Response::new(Empty {}))
68}