
- **lints: Fix 'doc_lazy_continuation'** - **lints: Fix 'doc_overindented_list_items'** - **inherent_to_string and io_other_error** - **Some more lint fixes** - **lints: enable bool_assert_comparison, match_like_matches_macro and wrong_self_convention** Release Notes: - N/A
91 lines
2.5 KiB
Rust
91 lines
2.5 KiB
Rust
use anyhow::{Result, anyhow};
|
|
use assistant_slash_command::{
|
|
ArgumentCompletion, SlashCommand, SlashCommandOutput, SlashCommandOutputSection,
|
|
SlashCommandResult,
|
|
};
|
|
use gpui::{Task, WeakEntity};
|
|
use language::{BufferSnapshot, LspAdapterDelegate};
|
|
use prompt_store::PromptStore;
|
|
use std::{
|
|
fmt::Write,
|
|
sync::{Arc, atomic::AtomicBool},
|
|
};
|
|
use ui::prelude::*;
|
|
use workspace::Workspace;
|
|
|
|
pub struct DefaultSlashCommand;
|
|
|
|
impl SlashCommand for DefaultSlashCommand {
|
|
fn name(&self) -> String {
|
|
"default".into()
|
|
}
|
|
|
|
fn description(&self) -> String {
|
|
"Insert default prompt".into()
|
|
}
|
|
|
|
fn menu_text(&self) -> String {
|
|
self.description()
|
|
}
|
|
|
|
fn requires_argument(&self) -> bool {
|
|
false
|
|
}
|
|
|
|
fn complete_argument(
|
|
self: Arc<Self>,
|
|
_arguments: &[String],
|
|
_cancellation_flag: Arc<AtomicBool>,
|
|
_workspace: Option<WeakEntity<Workspace>>,
|
|
_window: &mut Window,
|
|
_cx: &mut App,
|
|
) -> Task<Result<Vec<ArgumentCompletion>>> {
|
|
Task::ready(Err(anyhow!("this command does not require argument")))
|
|
}
|
|
|
|
fn run(
|
|
self: Arc<Self>,
|
|
_arguments: &[String],
|
|
_context_slash_command_output_sections: &[SlashCommandOutputSection<language::Anchor>],
|
|
_context_buffer: BufferSnapshot,
|
|
_workspace: WeakEntity<Workspace>,
|
|
_delegate: Option<Arc<dyn LspAdapterDelegate>>,
|
|
_window: &mut Window,
|
|
cx: &mut App,
|
|
) -> Task<SlashCommandResult> {
|
|
let store = PromptStore::global(cx);
|
|
cx.spawn(async move |cx| {
|
|
let store = store.await?;
|
|
let prompts = store.read_with(cx, |store, _cx| store.default_prompt_metadata())?;
|
|
|
|
let mut text = String::new();
|
|
text.push('\n');
|
|
for prompt in prompts {
|
|
if let Some(title) = prompt.title {
|
|
writeln!(text, "/prompt {}", title).unwrap();
|
|
}
|
|
}
|
|
text.pop();
|
|
|
|
if text.is_empty() {
|
|
text.push('\n');
|
|
}
|
|
|
|
if !text.ends_with('\n') {
|
|
text.push('\n');
|
|
}
|
|
|
|
Ok(SlashCommandOutput {
|
|
sections: vec![SlashCommandOutputSection {
|
|
range: 0..text.len(),
|
|
icon: IconName::Library,
|
|
label: "Default".into(),
|
|
metadata: None,
|
|
}],
|
|
text,
|
|
run_commands_in_text: true,
|
|
}
|
|
.into_event_stream())
|
|
})
|
|
}
|
|
}
|