#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Brand {
pub app_name: &'static str,
pub bin_name: &'static str,
pub env_prefix: &'static str,
pub profile_dir_name: &'static str,
pub settings_file_name: &'static str,
pub auth_store_file_name: &'static str,
pub sessions_dir_name: &'static str,
pub logs_dir_name: &'static str,
pub project_settings_file_name: &'static str,
pub project_dir_name: &'static str,
}
pub const BRAND: Brand = Brand {
app_name: "indusagi",
bin_name: "indusagi",
env_prefix: "INDUSAGI_",
profile_dir_name: ".indusagi",
settings_file_name: "settings.json",
auth_store_file_name: "auth.json",
sessions_dir_name: "sessions",
logs_dir_name: "logs",
project_settings_file_name: "settings.json",
project_dir_name: ".indusagi",
};
pub fn env_name_with(suffix: &str, brand: &Brand) -> String {
let mut out = String::with_capacity(brand.env_prefix.len() + suffix.len());
out.push_str(brand.env_prefix);
let mut prev_was_separator = false;
for ch in suffix.trim().chars() {
if ch.is_whitespace() || ch == '-' {
if !prev_was_separator {
out.push('_');
prev_was_separator = true;
}
} else {
for up in ch.to_uppercase() {
out.push(up);
}
prev_was_separator = false;
}
}
out
}
pub fn env_name(suffix: &str) -> String {
env_name_with(suffix, &BRAND)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn brand_constants_match_the_frozen_layout() {
assert_eq!(BRAND.app_name, "indusagi");
assert_eq!(BRAND.bin_name, "indusagi");
assert_eq!(BRAND.env_prefix, "INDUSAGI_");
assert_eq!(BRAND.profile_dir_name, ".indusagi");
assert_eq!(BRAND.auth_store_file_name, "auth.json");
assert_eq!(BRAND.sessions_dir_name, "sessions");
}
#[test]
fn env_name_grammar_is_byte_exact() {
assert_eq!(env_name("api key"), "INDUSAGI_API_KEY");
assert_eq!(env_name("HOME"), "INDUSAGI_HOME");
assert_eq!(env_name("home"), "INDUSAGI_HOME");
assert_eq!(env_name("multi word"), "INDUSAGI_MULTI_WORD");
assert_eq!(env_name("dash-separated"), "INDUSAGI_DASH_SEPARATED");
assert_eq!(env_name("a - b"), "INDUSAGI_A_B");
assert_eq!(env_name(" spaced "), "INDUSAGI_SPACED");
}
}