purefetch 0.1.0

A fast, fastfetch-style system information tool written entirely in Rust with zero dependencies
//! Distro ASCII logos and selection.
//!
//! GENERATED by scripts/genlogos.py from assets/logos/*.txt.
//! Edit the art files and re-run the script; do not edit this file by hand.

pub struct Logo {
    pub lines: &'static [&'static str],
    pub sgr: &'static str,
}

/// Resolve a logo selector ("auto", "debian", "none", ...) to a logo.
/// A known name wins; an unknown *explicit* name falls back to the detected
/// distro (matching fastfetch), and finally to the generic Tux logo.
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,
            }),
    )
}

/// The `ID` from /etc/os-release, normalized to a known logo name.
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)
}

/// Map os-release IDs to the logo names we ship.
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()
}

/// A logo for a known name/alias, or None if unrecognized.
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`._.'",
];