From ff00426c2c9d7d16de9221644e4f276f7e24d74a Mon Sep 17 00:00:00 2001 From: sigoden Date: Fri, 10 Mar 2023 07:08:40 +0800 Subject: chore: improve code quality, split rep/prompt.rs from repl/init.rs --- src/repl/prompt.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/repl/prompt.rs (limited to 'src/repl/prompt.rs') diff --git a/src/repl/prompt.rs b/src/repl/prompt.rs new file mode 100644 index 0000000..4c56626 --- /dev/null +++ b/src/repl/prompt.rs @@ -0,0 +1,64 @@ +use crate::config::SharedConfig; + +use reedline::{Prompt, PromptHistorySearch, PromptHistorySearchStatus}; +use std::borrow::Cow; + +const DEFAULT_MULTILINE_INDICATOR: &str = "::: "; + +#[derive(Clone)] +pub struct ReplPrompt(SharedConfig); + +impl ReplPrompt { + pub fn new(config: SharedConfig) -> Self { + Self(config) + } +} + +impl Prompt for ReplPrompt { + fn render_prompt_left(&self) -> Cow { + let config = self.0.lock(); + if let Some(role) = config.role.as_ref() { + role.name.to_string().into() + } else { + Cow::Borrowed("") + } + } + + fn render_prompt_right(&self) -> Cow { + let config = self.0.lock(); + if let Some(conversation) = config.conversation.as_ref() { + conversation.reamind_tokens().to_string().into() + } else { + Cow::Borrowed("") + } + } + + fn render_prompt_indicator(&self, _prompt_mode: reedline::PromptEditMode) -> Cow { + let config = self.0.lock(); + if config.conversation.is_some() { + Cow::Borrowed("$") + } else { + Cow::Borrowed("〉") + } + } + + fn render_prompt_multiline_indicator(&self) -> Cow { + Cow::Borrowed(DEFAULT_MULTILINE_INDICATOR) + } + + fn render_prompt_history_search_indicator( + &self, + history_search: PromptHistorySearch, + ) -> Cow { + let prefix = match history_search.status { + PromptHistorySearchStatus::Passing => "", + PromptHistorySearchStatus::Failing => "failing ", + }; + // NOTE: magic strings, given there is logic on how these compose I am not sure if it + // is worth extracting in to static constant + Cow::Owned(format!( + "({}reverse-search: {}) ", + prefix, history_search.term + )) + } +} -- cgit v1.2.3