Mountain/RPC/CocoonService/SCM/
RegisterScmProvider.rs1#![allow(non_snake_case)]
2
3use 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}