Skip to main content

Mountain/RPC/CocoonService/SCM/
RegisterScmProvider.rs

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