Mountain/Environment/
DebugProvider.rs1#![allow(non_snake_case, non_camel_case_types)]
22
23use std::sync::Arc;
24
25use Common::{
26 Debug::DebugService::DebugService,
27 Environment::Requires::Requires,
28 Error::CommonError::CommonError,
29 IPC::{DTO::ProxyTarget::ProxyTarget, IPCProvider::IPCProvider},
30};
31use async_trait::async_trait;
32use log::{info, warn};
33use serde_json::{Value, json};
34use url::Url;
35
36use super::MountainEnvironment::MountainEnvironment;
37
38#[async_trait]
39impl DebugService for MountainEnvironment {
40 async fn RegisterDebugConfigurationProvider(
41 &self,
42
43 DebugType:String,
44
45 _ProviderHandle:u32,
46
47 _SideCarIdentifier:String,
48 ) -> Result<(), CommonError> {
49 info!(
52 "[DebugProvider] Registering DebugConfigurationProvider for type '{}'",
53 DebugType
54 );
55 Ok(())
56 }
57
58 async fn RegisterDebugAdapterDescriptorFactory(
59 &self,
60
61 DebugType:String,
62
63 _FactoryHandle:u32,
64
65 _SideCarIdentifier:String,
66 ) -> Result<(), CommonError> {
67 info!(
69 "[DebugProvider] Registering DebugAdapterDescriptorFactory for type '{}'",
70 DebugType
71 );
72 Ok(())
73 }
74
75 async fn StartDebugging(&self, _FolderURI:Option<Url>, Configuration:Value) -> Result<String, CommonError> {
76 let SessionID = uuid::Uuid::new_v4().to_string();
77 info!(
78 "[DebugProvider] Starting debug session '{}' with config: {:?}",
79 SessionID, Configuration
80 );
81
82 let IPCProvider:Arc<dyn IPCProvider> = self.Require();
83 let DebugType = Configuration
84 .get("type")
85 .and_then(Value::as_str)
86 .ok_or_else(|| {
87 CommonError::InvalidArgument {
88 ArgumentName:"Configuration".into(),
89
90 Reason:"Missing 'type' field in debug configuration.".into(),
91 }
92 })?
93 .to_string();
94
95 let TargetSideCar = "cocoon-main".to_string();
97
98 info!("[DebugProvider] Resolving debug configuration...");
100 let ResolveConfigMethod = format!("{}$resolveDebugConfiguration", ProxyTarget::ExtHostDebug.GetTargetPrefix());
101 let ResolvedConfig = IPCProvider
102 .SendRequestToSideCar(
103 TargetSideCar.clone(),
104 ResolveConfigMethod,
105 json!([DebugType.clone(), Configuration]),
106 5000,
107 )
108 .await?;
109
110 info!("[DebugProvider] Creating debug adapter descriptor...");
112 let CreateDescriptorMethod =
113 format!("{}$createDebugAdapterDescriptor", ProxyTarget::ExtHostDebug.GetTargetPrefix());
114 let Descriptor = IPCProvider
115 .SendRequestToSideCar(
116 TargetSideCar.clone(),
117 CreateDescriptorMethod,
118 json!([DebugType, &ResolvedConfig]),
119 5000,
120 )
121 .await?;
122
123 info!("[DebugProvider] Spawning Debug Adapter based on descriptor: {:?}", Descriptor);
127 info!("[DebugProvider] Debug session '{}' started (simulation).", SessionID);
134 Ok(SessionID)
135 }
136
137 async fn SendCommand(&self, SessionID:String, Command:String, Arguments:Value) -> Result<Value, CommonError> {
138 warn!(
144 "[DebugProvider] SendCommand for session '{}' (command: '{}', args: {:?}) is not implemented.",
145 SessionID, Command, Arguments
146 );
147 Err(CommonError::NotImplemented { FeatureName:"DebugService.SendCommand".into() })
148 }
149}