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