use std::sync::atomic::AtomicBool; use std::sync::Arc; use anyhow::Result; use assistant_slash_command::{SlashCommand, SlashCommandOutput, SlashCommandOutputSection}; use chrono::{DateTime, Local}; use gpui::{AppContext, Task, WeakView}; use language::LspAdapterDelegate; use ui::{prelude::*, ButtonLike, ElevationIndex}; use workspace::Workspace; pub(crate) struct NowSlashCommand; impl SlashCommand for NowSlashCommand { fn name(&self) -> String { "now".into() } fn description(&self) -> String { "insert the current date and time".into() } fn menu_text(&self) -> String { "Insert current date and time".into() } fn requires_argument(&self) -> bool { false } fn complete_argument( self: Arc, _query: String, _cancel: Arc, _workspace: Option>, _cx: &mut AppContext, ) -> Task>> { Task::ready(Ok(Vec::new())) } fn run( self: Arc, _argument: Option<&str>, _workspace: WeakView, _delegate: Arc, _cx: &mut WindowContext, ) -> Task> { let now = Local::now(); let text = format!("Today is {now}.", now = now.to_rfc3339()); let range = 0..text.len(); Task::ready(Ok(SlashCommandOutput { text, sections: vec![SlashCommandOutputSection { range, icon: IconName::CountdownTimer, label: now.to_rfc3339().into(), }], run_commands_in_text: false, })) } } #[derive(IntoElement)] struct NowPlaceholder { pub id: ElementId, pub unfold: Arc, pub now: DateTime, } impl RenderOnce for NowPlaceholder { fn render(self, _cx: &mut WindowContext) -> impl IntoElement { let unfold = self.unfold; ButtonLike::new(self.id) .style(ButtonStyle::Filled) .layer(ElevationIndex::ElevatedSurface) .child(Icon::new(IconName::CountdownTimer)) .child(Label::new(self.now.to_rfc3339())) .on_click(move |_, cx| unfold(cx)) } }