use {
crossterm::style::Color,
serde::{Deserialize, Serialize},
std::{
borrow::Cow,
fmt::{Display, Formatter},
},
strum::{EnumIter, EnumString, IntoDiscriminant},
};
pub static DEFAULT_PROMPT_COLOR: Color = Color::Green;
pub static DEFAULT_PROMPT_MULTILINE_COLOR: nu_ansi_term::Color = nu_ansi_term::Color::LightBlue;
pub static DEFAULT_INDICATOR_COLOR: Color = Color::Cyan;
pub static DEFAULT_PROMPT_RIGHT_COLOR: Color = Color::AnsiValue(5);
pub enum PromptHistorySearchStatus {
Passing,
Failing,
}
pub struct PromptHistorySearch {
pub status: PromptHistorySearchStatus,
pub term: String,
}
impl PromptHistorySearch {
pub const fn new(status: PromptHistorySearchStatus, search_term: String) -> Self {
PromptHistorySearch {
status,
term: search_term,
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug, EnumIter, Default)]
pub enum PromptEditMode {
#[default]
Default,
Emacs,
Vi(PromptViMode),
Custom(String),
}
#[derive(Serialize, Deserialize, Clone, Debug, EnumIter, Default)]
pub enum PromptViMode {
#[default]
Normal,
Insert,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default, EnumIter, EnumString)]
#[strum(ascii_case_insensitive)]
pub enum PromptEditModeDiscriminants {
#[default]
Default,
Emacs,
#[strum(serialize = "ViNormal", serialize = "vi_normal")]
ViNormal,
#[strum(serialize = "ViInsert", serialize = "vi_insert")]
ViInsert,
Custom,
}
impl From<PromptViMode> for PromptEditMode {
fn from(value: PromptViMode) -> Self {
Self::Vi(value)
}
}
impl Display for PromptEditMode {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
use PromptViMode as Vi;
match self {
Self::Default => write!(f, "Default"),
Self::Emacs => write!(f, "Emacs"),
Self::Vi(Vi::Normal) => write!(f, "Vi_Normal"),
Self::Vi(Vi::Insert) => write!(f, "Vi_Insert"),
Self::Custom(s) => write!(f, "Custom_{s}"),
}
}
}
impl IntoDiscriminant for PromptEditMode {
type Discriminant = PromptEditModeDiscriminants;
fn discriminant(&self) -> Self::Discriminant {
use PromptViMode as Vi;
match self {
Self::Default => Self::Discriminant::Default,
Self::Emacs => Self::Discriminant::Emacs,
Self::Vi(Vi::Normal) => Self::Discriminant::ViNormal,
Self::Vi(Vi::Insert) => Self::Discriminant::ViInsert,
Self::Custom(_) => Self::Discriminant::Custom,
}
}
}
pub trait Prompt: Send {
fn render_prompt_left(&self) -> Cow<'_, str>;
fn render_prompt_right(&self) -> Cow<'_, str>;
fn render_prompt_indicator(&self, prompt_mode: PromptEditMode) -> Cow<'_, str>;
fn render_prompt_multiline_indicator(&self) -> Cow<'_, str>;
fn render_prompt_history_search_indicator(
&self,
history_search: PromptHistorySearch,
) -> Cow<'_, str>;
fn get_prompt_color(&self) -> Color {
DEFAULT_PROMPT_COLOR
}
fn get_prompt_multiline_color(&self) -> nu_ansi_term::Color {
DEFAULT_PROMPT_MULTILINE_COLOR
}
fn get_indicator_color(&self) -> Color {
DEFAULT_INDICATOR_COLOR
}
fn get_prompt_right_color(&self) -> Color {
DEFAULT_PROMPT_RIGHT_COLOR
}
fn right_prompt_on_last_line(&self) -> bool {
false
}
}