feat: Supported theming in the inquire prompts in the REPL

This commit is contained in:
2026-03-16 12:36:20 -06:00
parent 6fc1abf94a
commit d6022b9f98
3 changed files with 66 additions and 2 deletions
+10 -2
View File
@@ -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);
+53
View File
@@ -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,
}))
}
+3
View File
@@ -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};