Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RPC/CocoonService/SCM/
RegisterScmProvider.rs

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