feat: Supported theming in the inquire prompts in the REPL
This commit is contained in:
+10
-2
@@ -23,7 +23,7 @@ use crate::config::{
|
|||||||
TEMP_SESSION_NAME, WorkingMode, ensure_parent_exists, list_agents, load_env_file,
|
TEMP_SESSION_NAME, WorkingMode, ensure_parent_exists, list_agents, load_env_file,
|
||||||
macro_execute,
|
macro_execute,
|
||||||
};
|
};
|
||||||
use crate::render::render_error;
|
use crate::render::{render_error, prompt_theme};
|
||||||
use crate::repl::Repl;
|
use crate::repl::Repl;
|
||||||
use crate::utils::*;
|
use crate::utils::*;
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ use anyhow::{Result, anyhow, bail};
|
|||||||
use clap::{CommandFactory, Parser};
|
use clap::{CommandFactory, Parser};
|
||||||
use clap_complete::CompleteEnv;
|
use clap_complete::CompleteEnv;
|
||||||
use client::ClientConfig;
|
use client::ClientConfig;
|
||||||
use inquire::{Select, Text};
|
use inquire::{Select, Text, set_global_render_config};
|
||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
use log4rs::append::console::ConsoleAppender;
|
use log4rs::append::console::ConsoleAppender;
|
||||||
use log4rs::append::file::FileAppender;
|
use log4rs::append::file::FileAppender;
|
||||||
@@ -106,6 +106,14 @@ async fn main() -> Result<()> {
|
|||||||
)
|
)
|
||||||
.await?,
|
.await?,
|
||||||
));
|
));
|
||||||
|
|
||||||
|
{
|
||||||
|
let cfg = config.read();
|
||||||
|
if cfg.highlight {
|
||||||
|
set_global_render_config(prompt_theme(cfg.render_options()?)?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Err(err) = run(config, cli, text, abort_signal).await {
|
if let Err(err) = run(config, cli, text, abort_signal).await {
|
||||||
render_error(err);
|
render_error(err);
|
||||||
process::exit(1);
|
process::exit(1);
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
use syntect::highlighting::{Highlighter, Theme};
|
||||||
|
use anyhow::Result;
|
||||||
|
use inquire::ui::{Attributes, Color, RenderConfig, StyleSheet};
|
||||||
|
use syntect::parsing::Scope;
|
||||||
|
use crate::render::RenderOptions;
|
||||||
|
|
||||||
|
const DEFAULT_INQUIRE_PROMPT_THEME: Color = Color::DarkYellow;
|
||||||
|
|
||||||
|
pub fn prompt_theme<'a>(render_options: RenderOptions) -> Result<RenderConfig<'a>> {
|
||||||
|
let theme = render_options.theme.as_ref();
|
||||||
|
let mut render_config = RenderConfig::default();
|
||||||
|
|
||||||
|
if let Some(theme_ref) = theme {
|
||||||
|
let prompt_color = resolve_foreground(theme_ref, "markup.heading")?
|
||||||
|
.unwrap_or(DEFAULT_INQUIRE_PROMPT_THEME);
|
||||||
|
|
||||||
|
render_config.prompt = StyleSheet::new()
|
||||||
|
.with_fg(prompt_color)
|
||||||
|
.with_attr(Attributes::BOLD);
|
||||||
|
render_config.selected_option = Some(
|
||||||
|
render_config
|
||||||
|
.selected_option
|
||||||
|
.unwrap_or(render_config.option)
|
||||||
|
.with_attr(
|
||||||
|
render_config
|
||||||
|
.selected_option
|
||||||
|
.unwrap_or(render_config.option)
|
||||||
|
.att
|
||||||
|
| Attributes::BOLD,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
render_config.selected_checkbox = render_config
|
||||||
|
.selected_checkbox
|
||||||
|
.with_attr(render_config.selected_checkbox.style.att | Attributes::BOLD);
|
||||||
|
render_config.option = render_config
|
||||||
|
.option
|
||||||
|
.with_attr(render_config.option.att | Attributes::BOLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(render_config)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve_foreground(theme: &Theme, scope_str: &str) -> Result<Option<Color>> {
|
||||||
|
let scope = Scope::new(scope_str)?;
|
||||||
|
let style_mod = Highlighter::new(theme).style_mod_for_stack(&[scope]);
|
||||||
|
let fg = style_mod.foreground.or(theme.settings.foreground);
|
||||||
|
|
||||||
|
Ok(fg.map(|c| Color::Rgb {
|
||||||
|
r: c.r,
|
||||||
|
g: c.g,
|
||||||
|
b: c.b,
|
||||||
|
}))
|
||||||
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
mod markdown;
|
mod markdown;
|
||||||
mod stream;
|
mod stream;
|
||||||
|
mod inquire;
|
||||||
|
|
||||||
|
pub use inquire::prompt_theme;
|
||||||
|
|
||||||
pub use self::markdown::{MarkdownRender, RenderOptions};
|
pub use self::markdown::{MarkdownRender, RenderOptions};
|
||||||
use self::stream::{markdown_stream, raw_stream};
|
use self::stream::{markdown_stream, raw_stream};
|
||||||
|
|||||||
Reference in New Issue
Block a user