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
34	let DTO = ProviderRegistrationDTO {
35		Handle,
36
37		ProviderType:ProviderType::SourceControl,
38
39		Selector:json!([{ "scmId": Request.scm_id }]),
40
41		SideCarIdentifier:"cocoon-main".to_string(),
42
43		ExtensionIdentifier:json!(Request.extension_id),
44
45		Options:Some(json!({ "scmId": Request.scm_id })),
46	};
47
48	Service
49		.environment
50		.ApplicationState
51		.Extension
52		.ProviderRegistration
53		.RegisterProvider(Handle, DTO);
54
55	let CreateData = json!({
56		"handle": Handle,
57		"id": Request.scm_id,
58		"label": Request.scm_id,
59		"rootUri": null,
60		"extensionId": Request.extension_id,
61	});
62
63	if let Err(Error) = Service.environment.CreateSourceControl(CreateData).await {
64		dev_log!(
65			"cocoon",
66			"warn: [CocoonService] CreateSourceControl trait failed ({}); falling back to Sky emit",
67			Error
68		);
69
70		let _ = Service.environment.ApplicationHandle.emit(
71			"sky://scm/register",
72			json!({ "scmId": Request.scm_id, "extensionId": Request.extension_id }),
73		);
74	}
75
76	Ok(Response::new(Empty {}))
77}