simplify task queue API to directly accept futures (#137)

This commit is contained in:
Josh Thomas 2025-05-07 17:20:37 -05:00 committed by GitHub
parent eb5903822d
commit 5997d9b87a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 77 additions and 83 deletions

View file

@ -158,73 +158,75 @@ impl LanguageServer for DjangoLanguageServer {
let project_arc = Arc::clone(&self.project);
let client = self.client.clone();
let settings_arc = Arc::clone(&self.settings);
let task = move || async move {
let mut project_guard = project_arc.write().await;
if let Some(project) = project_guard.as_mut() {
let path_display = project.path().display().to_string();
client
.log_message(
MessageType::INFO,
&format!(
"Task: Starting initialization for project at: {}",
path_display
),
)
.await;
let venv_path = {
let settings = settings_arc.read().await;
settings.venv_path().map(|s| s.to_string())
};
if let Some(ref path) = venv_path {
if let Err(e) = self
.queue
.submit(async move {
let mut project_guard = project_arc.write().await;
if let Some(project) = project_guard.as_mut() {
let path_display = project.path().display().to_string();
client
.log_message(
MessageType::INFO,
&format!("Using virtual environment from config: {}", path),
&format!(
"Task: Starting initialization for project at: {}",
path_display
),
)
.await;
}
match project.initialize(venv_path.as_deref()) {
Ok(()) => {
let venv_path = {
let settings = settings_arc.read().await;
settings.venv_path().map(|s| s.to_string())
};
if let Some(ref path) = venv_path {
client
.log_message(
MessageType::INFO,
&format!(
"Task: Successfully initialized project: {}",
path_display
),
&format!("Using virtual environment from config: {}", path),
)
.await;
}
Err(e) => {
client
.log_message(
MessageType::ERROR,
&format!(
"Task: Failed to initialize Django project at {}: {}",
path_display, e
),
)
.await;
*project_guard = None;
}
}
} else {
client
.log_message(
MessageType::INFO,
"Task: No project instance found to initialize.",
)
.await;
}
Ok(())
};
if let Err(e) = self.queue.submit(task).await {
match project.initialize(venv_path.as_deref()) {
Ok(()) => {
client
.log_message(
MessageType::INFO,
&format!(
"Task: Successfully initialized project: {}",
path_display
),
)
.await;
}
Err(e) => {
client
.log_message(
MessageType::ERROR,
&format!(
"Task: Failed to initialize Django project at {}: {}",
path_display, e
),
)
.await;
*project_guard = None;
}
}
} else {
client
.log_message(
MessageType::INFO,
"Task: No project instance found to initialize.",
)
.await;
}
Ok(())
})
.await
{
self.log_message(
MessageType::ERROR,
&format!("Failed to submit project initialization task: {}", e),