1use {
2 crossterm::style::Color,
3 serde::{Deserialize, Serialize},
4 std::{
5 borrow::Cow,
6 fmt::{Display, Formatter},
7 },
8 strum_macros::EnumIter,
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)]
47pub enum PromptEditMode {
48 Default,
50
51 Emacs,
53
54 Vi(PromptViMode),
56
57 Custom(String),
59}
60
61#[derive(Serialize, Deserialize, Clone, Debug, EnumIter, Default)]
63pub enum PromptViMode {
64 #[default]
66 Normal,
67
68 Insert,
70}
71
72impl Display for PromptEditMode {
73 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
74 match self {
75 PromptEditMode::Default => write!(f, "Default"),
76 PromptEditMode::Emacs => write!(f, "Emacs"),
77 PromptEditMode::Vi(_) => write!(f, "Vi_Normal\nVi_Insert"),
78 PromptEditMode::Custom(s) => write!(f, "Custom_{s}"),
79 }
80 }
81}
82pub trait Prompt: Send {
87 fn render_prompt_left(&self) -> Cow<str>;
89 fn render_prompt_right(&self) -> Cow<str>;
91 fn render_prompt_indicator(&self, prompt_mode: PromptEditMode) -> Cow<str>;
93 fn render_prompt_multiline_indicator(&self) -> Cow<str>;
95 fn render_prompt_history_search_indicator(
97 &self,
98 history_search: PromptHistorySearch,
99 ) -> Cow<str>;
100 fn get_prompt_color(&self) -> Color {
102 DEFAULT_PROMPT_COLOR
103 }
104 fn get_prompt_multiline_color(&self) -> nu_ansi_term::Color {
106 DEFAULT_PROMPT_MULTILINE_COLOR
107 }
108 fn get_indicator_color(&self) -> Color {
110 DEFAULT_INDICATOR_COLOR
111 }
112 fn get_prompt_right_color(&self) -> Color {
114 DEFAULT_PROMPT_RIGHT_COLOR
115 }
116
117 fn right_prompt_on_last_line(&self) -> bool {
119 false
120 }
121}