use std::env;
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]
pub enum Depth {
Tty = 3,
Low = 4,
Medium = 8,
High = 24,
}
impl Depth {
pub fn try_infer() -> Option<Depth> {
if env::var("COLORTERM").is_ok_and(|value| ["truecolor", "24bit"].contains(&value.as_str()))
{
return Some(Self::High);
}
match env::var("TERM") {
Ok(term) if term == "dumb" => None,
Ok(term)
if term.contains("24bit")
|| term.contains("24-bit")
|| term == "terminator"
|| term == "mosh" =>
{
Some(Self::High)
}
Ok(term) if term.contains("256") => Some(Self::Medium),
_ => Some(Self::Low),
}
}
}
impl TryFrom<u8> for Depth {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
3 => Ok(Self::Tty),
4 => Ok(Self::Low),
8 => Ok(Self::Medium),
24 => Ok(Self::High),
_ => Err(()),
}
}
}
impl TryFrom<&str> for Depth {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value.to_ascii_lowercase().as_str() {
"3" => Ok(Self::Tty),
"4" => Ok(Self::Low),
"8" => Ok(Self::Medium),
"24" => Ok(Self::High),
"tty" => Ok(Self::Tty),
"low" => Ok(Self::Low),
"medium" => Ok(Self::Medium),
"high" => Ok(Self::High),
_ => Err(()),
}
}
}