use crate::extensions::p10k::config::{p9k_global, p9k_param};
use crate::extensions::p10k::icons;
use crate::extensions::p10k::render::Segment;
use crate::ported::params::getsparam;
use crate::ported::utils::getkeystring;
pub(crate) fn color1() -> &'static str {
if p9k_global("COLOR_SCHEME", "dark") == "light" {
"7"
} else {
"0"
}
}
pub(crate) fn color2() -> &'static str {
if p9k_global("COLOR_SCHEME", "dark") == "light" {
"0"
} else {
"7"
}
}
pub(crate) fn env_or_param(name: &str) -> String {
if let Some(v) = getsparam(name) {
return v;
}
std::env::var(name).unwrap_or_default()
}
pub(crate) fn global_bool(name: &str, default: bool) -> bool {
match getsparam(&format!("POWERLEVEL9K_{name}")) {
Some(v) => v == "true",
None => default,
}
}
pub(crate) fn global_int(name: &str, default: i64) -> i64 {
getsparam(&format!("POWERLEVEL9K_{name}"))
.and_then(|v| v.trim().parse::<i64>().ok())
.unwrap_or(default)
}
pub(crate) fn global_float(name: &str, default: f64) -> f64 {
getsparam(&format!("POWERLEVEL9K_{name}"))
.and_then(|v| v.trim().parse::<f64>().ok())
.unwrap_or(default)
}
pub(crate) fn esc_pct(s: &str) -> String {
s.replace('%', "%%")
}
pub(crate) fn decode_g(s: &str) -> String {
getkeystring(s).0
}
pub(crate) fn seg_icon(segment: &str, state: Option<&str>, key: &str) -> String {
let probed = p9k_param(segment, state, key, "\u{1}");
if probed == "\u{1}" {
return icons::icon(key).to_string();
}
let decoded = decode_g(&probed);
let mut ch = decoded.chars();
if ch.next() == Some('\u{8}') && ch.next().is_some() && ch.next().is_none() {
return format!("%{{{decoded}%}}");
}
decoded
}
pub(crate) fn apply_visual_identifier(segment: &str, state: Option<&str>, icon: String) -> Option<String> {
let exp = p9k_param(
segment,
state,
"VISUAL_IDENTIFIER_EXPANSION",
"${P9K_VISUAL_IDENTIFIER}",
);
let resolved = if exp == "${P9K_VISUAL_IDENTIFIER}" {
icon
} else if !exp.contains('$') {
exp
} else {
icon };
if resolved.is_empty() {
None
} else {
Some(resolved)
}
}
pub(crate) fn apply_content_expansion(_segment: &str, _state: Option<&str>, content: String) -> String {
content
}
pub(crate) fn make_segment(
name: &str,
state: Option<&str>,
default_bg: &str,
default_fg: &str,
icon_key: &str,
content: String,
) -> Segment {
let bg = p9k_param(name, state, "BACKGROUND", default_bg);
let fg = p9k_param(name, state, "FOREGROUND", default_fg);
let icon_glyph = if icon_key.is_empty() {
String::new()
} else {
seg_icon(name, state, icon_key)
};
let icon = apply_visual_identifier(name, state, icon_glyph);
let content = apply_content_expansion(name, state, content);
Segment {
name: name.to_string(),
state: state.map(|s| s.to_string()),
content,
icon,
fg,
bg,
}
}
pub(crate) fn glob_name_matches(pattern: &str, name: &str) -> bool {
let mut t = pattern.to_string();
crate::ported::glob::tokenize(&mut t);
crate::ported::pattern::patcompile(&t, 0, None)
.is_some_and(|prog| crate::ported::pattern::pattry(&prog, name))
}