use std::collections::HashMap;
use std::path::Path;
#[derive(Debug, Clone, Default)]
pub struct AsciiArtStore {
pub art: HashMap<String, String>,
}
impl AsciiArtStore {
pub fn load_from_dir(dir: &Path) -> Self {
let mut store = Self::default();
if !dir.exists() {
return store;
}
if let Ok(entries) = std::fs::read_dir(dir) {
for entry in entries.flatten() {
let path = entry.path();
if path.extension().map(|e| e == "txt" || e == "ascii").unwrap_or(false) {
if let Ok(content) = std::fs::read_to_string(&path) {
let id = path.file_stem()
.and_then(|s| s.to_str())
.unwrap_or("")
.to_string();
store.art.insert(id, content);
}
}
}
}
store
}
pub fn load_embedded() -> Self {
let mut store = Self::default();
store.art.insert("windows-31".to_string(), include_str!("../../assets/ascii/windows-31.txt").to_string());
store.art.insert("windows-95".to_string(), include_str!("../../assets/ascii/windows-95.txt").to_string());
store.art.insert("windows-98".to_string(), include_str!("../../assets/ascii/windows-98.txt").to_string());
store.art.insert("windows-98se".to_string(), include_str!("../../assets/ascii/windows-98se.txt").to_string());
store.art.insert("windows-me".to_string(), include_str!("../../assets/ascii/windows-me.txt").to_string());
store.art.insert("windows-2000".to_string(), include_str!("../../assets/ascii/windows-2000.txt").to_string());
store.art.insert("windows-xp".to_string(), include_str!("../../assets/ascii/windows-xp.txt").to_string());
store.art.insert("windows-vista".to_string(), include_str!("../../assets/ascii/windows-vista.txt").to_string());
store.art.insert("windows-7".to_string(), include_str!("../../assets/ascii/windows-7.txt").to_string());
store.art.insert("windows-10".to_string(), include_str!("../../assets/ascii/windows-10.txt").to_string());
store.art.insert("windows-11".to_string(), include_str!("../../assets/ascii/windows-11.txt").to_string());
store.art.insert("ms-dos".to_string(), include_str!("../../assets/ascii/ms-dos.txt").to_string());
store.art.insert("dos".to_string(), include_str!("../../assets/ascii/ms-dos.txt").to_string());
store.art.insert("my-first-pc".to_string(), include_str!("../../assets/ascii/ms-dos.txt").to_string());
store.art.insert("mac-system7".to_string(), include_str!("../../assets/ascii/mac-system7.txt").to_string());
store.art.insert("mac-os9".to_string(), include_str!("../../assets/ascii/mac-os9.txt").to_string());
store.art.insert("mac-osx".to_string(), include_str!("../../assets/ascii/mac-osx.txt").to_string());
store.art.insert("mac-osx-tiger".to_string(), include_str!("../../assets/ascii/mac-osx-tiger.txt").to_string());
store.art.insert("mac-osx-leopard".to_string(), include_str!("../../assets/ascii/mac-osx-leopard.txt").to_string());
store.art.insert("linux".to_string(), include_str!("../../assets/ascii/linux.txt").to_string());
store.art.insert("linux-fedora".to_string(), include_str!("../../assets/ascii/linux-fedora.txt").to_string());
store.art.insert("linux-debian".to_string(), include_str!("../../assets/ascii/linux-debian.txt").to_string());
store.art.insert("linux-ubuntu".to_string(), include_str!("../../assets/ascii/linux-ubuntu.txt").to_string());
store.art.insert("linux-mint".to_string(), include_str!("../../assets/ascii/linux-mint.txt").to_string());
store.art.insert("linux-pop".to_string(), include_str!("../../assets/ascii/linux-pop.txt").to_string());
store.art.insert("linux-zorin".to_string(), include_str!("../../assets/ascii/linux-zorin.txt").to_string());
store.art.insert("linux-cachyos".to_string(), include_str!("../../assets/ascii/linux-cachyos.txt").to_string());
store.art.insert("linux-garuda".to_string(), include_str!("../../assets/ascii/linux-garuda.txt").to_string());
store.art.insert("linux-bazzite".to_string(), include_str!("../../assets/ascii/linux-bazzite.txt").to_string());
store.art.insert("nix-os".to_string(), include_str!("../../assets/ascii/nix-os.txt").to_string());
store.art.insert("freebsd".to_string(), include_str!("../../assets/ascii/freebsd.txt").to_string());
store.art.insert("solaris".to_string(), include_str!("../../assets/ascii/solaris.txt").to_string());
store.art.insert("os2-warp3".to_string(), include_str!("../../assets/ascii/os2-warp3.txt").to_string());
store.art.insert("os2-warp4".to_string(), include_str!("../../assets/ascii/os2-warp4.txt").to_string());
store.art.insert("beos".to_string(), include_str!("../../assets/ascii/beos.txt").to_string());
store.art.insert("haiku".to_string(), include_str!("../../assets/ascii/haiku.txt").to_string());
store.art.insert("nextstep".to_string(), include_str!("../../assets/ascii/nextstep.txt").to_string());
store.art.insert("plan9".to_string(), include_str!("../../assets/ascii/plan9.txt").to_string());
store
}
pub fn get(&self, id: &str) -> Option<&str> {
self.art.get(id).map(|s| s.as_str())
}
pub fn get_or_fallback(&self, id: &str) -> &str {
if let Some(art) = self.get(id) {
return art;
}
let id_lower = id.to_lowercase();
if id_lower.contains("windows") {
return WINDOWS_FALLBACK;
} else if id_lower.contains("mac") || id_lower.contains("osx") {
return MAC_FALLBACK;
} else if id_lower.contains("linux") {
return LINUX_FALLBACK;
} else if id_lower.contains("dos") {
return DOS_FALLBACK;
} else if id_lower.contains("os2") || id_lower.contains("os-2") {
return IBM_FALLBACK;
}
DEFAULT_FALLBACK
}
pub fn merge(&mut self, overrides: AsciiArtStore) {
for (id, art) in overrides.art {
self.art.insert(id, art);
}
}
}
const WINDOWS_FALLBACK: &str = include_str!("../../assets/ascii/_windows.txt");
const MAC_FALLBACK: &str = include_str!("../../assets/ascii/_mac.txt");
const LINUX_FALLBACK: &str = include_str!("../../assets/ascii/_linux.txt");
const DOS_FALLBACK: &str = include_str!("../../assets/ascii/_dos.txt");
const IBM_FALLBACK: &str = include_str!("../../assets/ascii/_ibm.txt");
const DEFAULT_FALLBACK: &str = include_str!("../../assets/ascii/_default.txt");