use anyhow::Result;
use shiki_config::Config;
pub fn list(config: &Config) -> Result<()> {
for theme in shiki_config::themes::all() {
let marker = if theme.name == config.theme.name {
"*"
} else {
" "
};
println!("{marker} {}", theme.name);
}
Ok(())
}
pub fn set(config: &mut Config, name: &str) -> Result<()> {
if shiki_config::themes::by_name(name).is_none() {
anyhow::bail!("unknown theme '{name}' — run `shiki theme list` to see available themes");
}
if config.theme.name != name {
config.theme.overrides = Default::default();
}
config.theme.name = name.to_string();
config.save(&Config::default_path()?)?;
println!("theme set to '{name}'");
Ok(())
}
pub fn create(config: &mut Config, from: Option<&str>) -> Result<()> {
let base_name = from.unwrap_or(&config.theme.name).to_string();
let base = shiki_config::themes::by_name(&base_name).ok_or_else(|| {
anyhow::anyhow!(
"unknown theme '{base_name}' — run `shiki theme list` to see available themes"
)
})?;
config.theme.name = base_name.clone();
config.theme.overrides = shiki_config::config::ThemeOverrides::from_theme(&base);
let path = Config::default_path()?;
config.save(&path)?;
println!(
"scaffolded all 19 color slots from '{base_name}' into {}'s [theme.overrides] — edit any \
value there; removing a key falls back to '{base_name}' for that slot",
path.display()
);
Ok(())
}