1use {
2 crossterm::style::Color,
3 serde::{Deserialize, Serialize},
4 std::{
5 borrow::Cow,
6 fmt::{Display, Formatter},
7 },
8 strum::{EnumIter, EnumString, IntoDiscriminant},
9};
10
11pub static DEFAULT_PROMPT_COLOR: Color = Color::Green;
13pub static DEFAULT_PROMPT_MULTILINE_COLOR: nu_ansi_term::Color = nu_ansi_term::Color::LightBlue;
14pub static DEFAULT_INDICATOR_COLOR: Color = Color::Cyan;
15pub static DEFAULT_PROMPT_RIGHT_COLOR: Color = Color::AnsiValue(5);
16
17pub enum PromptHistorySearchStatus {
19 Passing,
21
22 Failing,
24}
25
26pub struct PromptHistorySearch {
28 pub status: PromptHistorySearchStatus,
30
31 pub term: String,
33}
34
35impl PromptHistorySearch {
36 pub const fn new(status: PromptHistorySearchStatus, search_term: String) -> Self {
38 PromptHistorySearch {
39 status,
40 term: search_term,
41 }
42 }
43}
44
45#[derive(Serialize, Deserialize, Clone, Debug, EnumIter, Default)]
47pub enum PromptEditMode {
48 #[default]
50 Default,
51
52 Emacs,
54
55 Vi(PromptViMode),
57
58 Custom(String),
60}
61
62#[derive(Serialize, Deserialize, Clone, Debug, EnumIter, Default)]
64pub enum PromptViMode {
65 #[default]
67 Normal,
68
69 Insert,
71}
72
73#[derive(Clone, Copy, Debug, PartialEq, Eq, Default, EnumIter, EnumString)]
75#[strum(ascii_case_insensitive)]
76pub enum PromptEditModeDiscriminants {
77 #[default]
79 Default,
80
81 Emacs,
83
84 #[strum(serialize = "ViNormal", serialize = "vi_normal")]
86 ViNormal,
87
88 #[strum(serialize = "ViInsert", serialize = "vi_insert")]
90 ViInsert,
91
92 Custom,
94}
95
96impl From<PromptViMode> for PromptEditMode {
97 fn from(value: PromptViMode) -> Self {
98 Self::Vi(value)
99 }
100}
101
102impl Display for PromptEditMode {
103 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
104 use PromptViMode as Vi;
105 match self {
106 Self::Default => write!(f, "Default"),
107 Self::Emacs => write!(f, "Emacs"),
108 Self::Vi(Vi::Normal) => write!(f, "Vi_Normal"),
109 Self::Vi(Vi::Insert) => write!(f, "Vi_Insert"),
110 Self::Custom(s) => write!(f, "Custom_{s}"),
111 }
112 }
113}
114
115impl IntoDiscriminant for PromptEditMode {
116 type Discriminant = PromptEditModeDiscriminants;
117
118 fn discriminant(&self) -> Self::Discriminant {
119 use PromptViMode as Vi;
120 match self {
121 Self::Default => Self::Discriminant::Default,
122 Self::Emacs => Self::Discriminant::Emacs,
123 Self::Vi(Vi::Normal) => Self::Discriminant::ViNormal,
124 Self::Vi(Vi::Insert) => Self::Discriminant::ViInsert,
125 Self::Custom(_) => Self::Discriminant::Custom,
126 }
127 }
128}
129
130pub trait Prompt: Send {
135 fn render_prompt_left(&self) -> Cow<'_, str>;
137 fn render_prompt_right(&self) -> Cow<'_, str>;
139 fn render_prompt_indicator(&self, prompt_mode: PromptEditMode) -> Cow<'_, str>;
141 fn render_prompt_multiline_indicator(&self) -> Cow<'_, str>;
143 fn render_prompt_history_search_indicator(
145 &self,
146 history_search: PromptHistorySearch,
147 ) -> Cow<'_, str>;
148 fn get_prompt_color(&self) -> Color {
150 DEFAULT_PROMPT_COLOR
151 }
152 fn get_prompt_multiline_color(&self) -> nu_ansi_term::Color {
154 DEFAULT_PROMPT_MULTILINE_COLOR
155 }
156 fn get_indicator_color(&self) -> Color {
158 DEFAULT_INDICATOR_COLOR
159 }
160 fn get_prompt_right_color(&self) -> Color {
162 DEFAULT_PROMPT_RIGHT_COLOR
163 }
164
165 fn right_prompt_on_last_line(&self) -> bool {
167 false
168 }
169}