Mountain/RPC/CocoonService/SCM/
RegisterScmProvider.rs1
2use 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}