pub struct Logo {
pub lines: &'static [&'static str],
pub sgr: &'static str,
}
pub fn get(selector: &str) -> Option<Logo> {
let sel = selector.to_ascii_lowercase();
if sel == "none" || sel == "off" {
return None;
}
let name = if sel == "auto" { detect_distro() } else { sel };
Some(
known(&name)
.or_else(|| known(&detect_distro()))
.unwrap_or(Logo {
lines: TUX,
sgr: TUX_SGR,
}),
)
}
fn detect_distro() -> String {
let id = std::fs::read_to_string("/etc/os-release")
.ok()
.and_then(|s| {
s.lines().find_map(|l| {
l.strip_prefix("ID=")
.map(|v| v.trim().trim_matches('"').to_ascii_lowercase())
})
})
.unwrap_or_default();
normalize(&id)
}
fn normalize(id: &str) -> String {
if id.starts_with("opensuse") {
return "opensuse".to_string();
}
match id {
"linuxmint" => "mint",
"raspbian" | "raspberry-pi-os" => "debian",
"popos" => "pop",
"" => "tux",
other => other,
}
.to_string()
}
fn known(name: &str) -> Option<Logo> {
Some(match name {
"debian" => Logo {
lines: DEBIAN,
sgr: "215;7;81",
},
"arch" => Logo {
lines: ARCH,
sgr: "23;147;209",
},
"ubuntu" => Logo {
lines: UBUNTU,
sgr: "233;84;32",
},
"fedora" => Logo {
lines: FEDORA,
sgr: "60;110;180",
},
"mint" => Logo {
lines: MINT,
sgr: "111;190;70",
},
"manjaro" => Logo {
lines: MANJARO,
sgr: "53;191;92",
},
"pop" => Logo {
lines: POP,
sgr: "72;185;199",
},
"opensuse" => Logo {
lines: OPENSUSE,
sgr: "115;186;37",
},
"alpine" => Logo {
lines: ALPINE,
sgr: "12;89;191",
},
"void" => Logo {
lines: VOID,
sgr: "71;138;58",
},
"nixos" => Logo {
lines: NIXOS,
sgr: "82;119;195",
},
"tux" | "linux" | "generic" => Logo {
lines: TUX,
sgr: TUX_SGR,
},
_ => return None,
})
}
const TUX_SGR: &str = "236;236;236";
const DEBIAN: &[&str] = &[
" _,met$$$$$gg.",
" ,g$$$$$$$$$$$$$$$P.",
" ,g$$P\" \"\"\"Y$$.\".",
" ,$$P' `$$$.",
"',$$P ,ggs. `$$b:",
"`d$$' ,$P\"' . $$$",
" $$P d$' , $$P",
" $$: $$. - ,d$$'",
" $$; Y$b._ _,d$P'",
" Y$$. `.`\"Y$$$$P\"'",
" `$$b \"-.__",
" `Y$$",
" `Y$$.",
" `$$b.",
" `Y$$b.",
" `\"Y$b._",
" `\"\"\"",
];
const ARCH: &[&str] = &[
" -'",
" .o+'",
" 'ooo/",
" '+oooo:",
" '+oooooo:",
" -+oooooo+:",
" '/:-:++oooo+:",
" '/++++/+++++++:",
" '/++++++++++++++:",
" '/+++ooooooooooooo/'",
" ./ooosssso++osssssso+'",
" .oossssso-''''/ossssss+'",
" -osssssso. :ssssssso.",
" :osssssss/ osssso+++.",
" /ossssssss/ +ssssooo/-",
" '/ossssso+/:- -:/+osssso+-",
" '+sso+:-' '.-/+oso:",
" '++:. '-/+/",
" .' '/",
];
const UBUNTU: &[&str] = &[
" .-/+oossssoo+/-.",
" .:+ssssssssssssssssss+:.",
" -+ssssssssssssssssssyyssss+-",
" .ossssssssssssssssssdMMMNysssso.",
" /ssssssssssshdmmNNmmyNMMMMhssssss/",
" +ssssssssshmydMMMMMMMNddddyssssssss+",
" /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/",
".ssssssssdMMMNhsssssssssshNMMMdssssssss.",
"+sssshhhyNMMNyssssssssssssyNMMMysssssss+",
"ossyNMMMNyMMhsssssssssssssshmmmhssssssso",
"ossyNMMMNyMMhsssssssssssssshmmmhssssssso",
"+sssshhhyNMMNyssssssssssssyNMMMysssssss+",
".ssssssssdMMMNhsssssssssshNMMMdssssssss.",
" /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/",
" +sssssssssdmydMMMMMMMMddddyssssssss+",
" /ssssssssssshdmNNNNmyNMMMMhssssss/",
" .ossssssssssssssssssdMMMNysssso.",
" -+sssssssssssssssssyyyssss+-",
" .:+ssssssssssssssssss+:.",
" .-/+oossssoo+/-.",
];
const FEDORA: &[&str] = &[
" /:-------------:\\",
" :-------------------::",
" :-----------/shhOHbmp---:\\",
" /-----------omMMMNNNMMD ---:",
" :-----------sMMMMNMNMP. ---:",
" :-----------:MMMdP------- ---\\",
",------------:MMMd-------- ---:",
":------------:MMMd------- .---:",
":---- oNMMMMMMMMMNho .----:",
":-- .+shhhMMMmhhy++ .------/",
":- -------:MMMd--------------:",
":- --------/MMMd-------------;",
":- ------/hMMMy------------:",
":-- :dMNdhhdNMMNo------------;",
":---:sdNMMMMNds:------------:",
":------:://:-------------::",
" :---------------------://",
];
const MINT: &[&str] = &[
" ...-:::::-...",
" .-MMMMMMMMMMMMMMM-.",
" .-MMMM'..-:::::::-..'MMMM-.",
" .:MMMM.:MMMMMMMMMMMMMMM:.MMMM:.",
" -MMM-M---MMMMMMMMMMMMMMMMMMM.MMM-",
" ':MMM:MM' :MMMM:....::-...-MMMM:MMM:'",
" :MMM:MMM' :MM:' '' '' ':MMM:MMM:",
".MMM.MMMM' :MM. -MM. .MM- 'MMMM.MMM.",
":MMM:MMMM' :MM. -MM- .MM: 'MMMM-MMM:",
":MMM:MMMM' :MM. -MM- .MM: 'MMMM:MMM:",
":MMM:MMMM' :MM. -MM- .MM: 'MMMM-MMM:",
".MMM.MMMM' :MM:--:MM:--:MM: 'MMMM.MMM.",
" :MMM:MMM- '-MMMMMMMMMMMM-' -MMM-MMM:",
" :MMM:MMM:' ':MMM:MMM:",
" .MMM.MMMM:--------------:MMMM.MMM.",
" '-MMMM.-MMMMMMMMMMMMMMM-.MMMM-'",
" '.-MMMM''--:::::--''MMMM-.'",
" '-MMMMMMMMMMMMM-'",
" ''-:::::-''",
];
const MANJARO: &[&str] = &[
"██████████████████ ████████",
"██████████████████ ████████",
"██████████████████ ████████",
"██████████████████ ████████",
"██████████████████ ████████",
"████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
"████████ ████████ ████████",
];
const POP: &[&str] = &[
" /////////////",
" /////////////////////",
" ///////*767////////////////",
" //////7676767676*//////////////",
" /////76767//7676767//////////////",
" /////767676///*76767///////////////",
" ///////767676///76767.///7676*///////",
"/////////767676//76767///767676////////",
"//////////76767676767////76767/////////",
"///////////76767676//////7676//////////",
"////////////,7676,///////767///////////",
"/////////////*7676///////76////////////",
"///////////////7676////////////////////",
" ///////////////7676///767////////////",
" //////////////////////'////////////",
" //////.7676767676767676767,//////",
" /////767676767676767676767/////",
" ///////////////////////////",
" /////////////////////",
" /////////////",
];
const OPENSUSE: &[&str] = &[
" .;ldkO0000Okdl;.",
" .;d00xl:^''''''^:ok00d;.",
" .d00l' 'o00d.",
" .d0Kd' Okxol:;,. :O0d.",
" .OKKKK0kOKKKKKKKKKKOxo:, lKO.",
" ,0KKKKKKKKKKKKKKKK0P^,,,^dx: ;00,",
".OKKKKKKKKKKKKKKKKk'.oOPPb.'0k. cKO.",
":KKKKKKKKKKKKKKKKK: kKx..dd lKd 'OK:",
"dKKKKKKKKKKKKKKKKk; .'kdkkx.'0k. c00,",
"xKKKKKKKKKKKKKKKKKKk0KKKKKKKKKk; dKO.",
"lKKKKKKKKKKKKKKKKKKKKKKKK0Pd:kd dKO.",
";00KKKKKKKKKKKKKKKKKKKKKKk;.,0k. cKO;",
" ,KKKKKKKKKKKKKKKKKKKKK0k; .0K,",
" .OKKKKKKKKKKKKKKKK0k:. .dKO.",
" .d0KKKKKKKKKK0kd:. :O0d.",
" .d00OKKKKKO0d' 'o00d.",
" .;d00xl:^''''''^:ok00d;.",
" .;ldkO0000Okdl;.",
];
const ALPINE: &[&str] = &[
" .hddddddddddddddddddddddh.",
" :dddddddddddddddddddddddddd:",
" /dddddddddddddddddddddddddddd/",
" +dddddddddddddddddddddddddddddd+",
" 'sdddddddddddddddddddddddddddddddds'",
" 'ydddddddddddd++hdddddddddddddddddddy'",
".hddddddddddd+' '+ddddh:-sdddddddddddh.",
"hdddddddddd+' '+y: .yddddddddddddh",
"ddddddddh+' '//' '.' -sddddddddddddd",
"ddddddh+' '/hddh/' ':s- -sdddddddddd",
"ddddh+' '/+/dddddh/' '+s- -sdddddddd",
"ddd+' '/o' :dddddddh/' 'oy- .ydddddd",
"hdddyo+ohddyosdddddddddho+oydddy++ohdddh",
".hddddddddddddddddddddddddddddddddddddh.",
" 'yddddddddddddddddddddddddddddddddddy'",
" 'sdddddddddddddddddddddddddddddddds'",
" +dddddddddddddddddddddddddddddd+",
" /dddddddddddddddddddddddddddd/",
" :dddddddddddddddddddddddddd:",
" .hddddddddddddddddddddddh.",
];
const VOID: &[&str] = &[
" __.;=====;.__",
" _.=+==++=++=+=+===;.",
" -=+++=+===+=++=+++++=_",
" . -=:'' '--==+=++==.",
" _vi, ' --+=++++:",
" .uvnvi. _._ -==+==+.",
" .vvnvnI' .;==|==;. :|=||=|.",
"+QmQQmpvvnv; _yYsSXkyQ7k;//=+++++.",
"+QQmQQmmmpvsvpu 6WQmk} //=++++++.",
" QmmQQQQmmvsv+; jQm} 6QQmv=++++++.",
" YmmmQQQpvsv+; jQm} 6QQmv=+++++.",
" 4QmmQpvvsv+; jQm} 6QQv=+++++.",
" 9QmpvvsQ+; jQm}6QQv=+++;",
" \"9pvsQm; jQmQQv=++;",
" \"9QmQm;jQmQv=+;",
" \"\"9QmQv=;",
];
const NIXOS: &[&str] = &[
" ▜███▙ ▜███▙ ▟███▛",
" ▜███▙ ▜███▙▟███▛",
" ▜███▙ ▜██████▛",
" ▟█████████████████▙ ▜████▛ ▟▙",
" ▟███████████████████▙ ▜███▙ ▟██▙",
" ▄▄▄▄▖ ▜███▙ ▟███▛",
" ▟███▛ ▜██▛ ▟███▛",
" ▟███▛ ▜▛ ▟███▛",
"▟███████████▛ ▟███████▙",
"▜██████████▛ ▟████████▛",
" ▟███▛ ▟▙ ▟███▛",
" ▟███▛ ▟██▙ ▟███▛",
" ▟███▛ ▜███▙ ▄▄▄▄▖",
" ▟███▛ ▜███▙▄▄▄▄▄▄▄▄▄▟███████████▖",
" ▜██▛ ▜███▙▀▀▀▀▀▀▀▀▀▜███████████▘",
" ▜▛ ▟████▙▄▄▄▄▄▄▄▄▄▟███▛",
" ▟███████████████▙▜███▙ ▄▄▄▄▖",
" ▟███████████████▛ ▜███▙ ▟███▛",
" ▟███▛ ▜██████▛",
" ▟███▛ ▜███▙",
];
const TUX: &[&str] = &[
" a8888b.",
" d888888b.",
" 8P\"YP\"Y88",
" 8|o||o|88",
" 8' .88",
" 8`._.' Y8.",
" d/ `8b.",
" dP . Y8b.",
" d8:' \" `::88b",
" d8\" 'Y88b",
" :8P ' :888",
" 8a. : _a88P",
" ._/\"Yaa_: .| 88P|",
" \\ YP\" `| 8P `.",
" / \\.___.d| .'",
" `--..__)8888P`._.'",
];