use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub enum ThemeName {
#[serde(rename = "dark")]
Dark,
#[serde(rename = "light")]
Light,
#[serde(rename = "midnight")]
#[default]
Midnight,
#[serde(rename = "nord")]
Nord,
#[serde(rename = "monokai")]
Monokai,
#[serde(rename = "anthropic_light")]
AnthropicLight,
#[serde(rename = "anthropic_dark")]
AnthropicDark,
}
impl std::str::FromStr for ThemeName {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"dark" => Ok(ThemeName::Dark),
"light" => Ok(ThemeName::Light),
"midnight" => Ok(ThemeName::Midnight),
"nord" => Ok(ThemeName::Nord),
"monokai" => Ok(ThemeName::Monokai),
"anthropic_light" => Ok(ThemeName::AnthropicLight),
"anthropic_dark" => Ok(ThemeName::AnthropicDark),
_ => Ok(ThemeName::default()),
}
}
}
impl std::fmt::Display for ThemeName {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ThemeName::Dark => write!(f, "dark"),
ThemeName::Light => write!(f, "light"),
ThemeName::Midnight => write!(f, "midnight"),
ThemeName::Nord => write!(f, "nord"),
ThemeName::Monokai => write!(f, "monokai"),
ThemeName::AnthropicLight => write!(f, "anthropic_light"),
ThemeName::AnthropicDark => write!(f, "anthropic_dark"),
}
}
}
impl ThemeName {
pub fn all() -> &'static [ThemeName] {
&[
ThemeName::Dark,
ThemeName::Light,
ThemeName::Midnight,
ThemeName::Nord,
ThemeName::Monokai,
ThemeName::AnthropicLight,
ThemeName::AnthropicDark,
]
}
pub fn next(&self) -> ThemeName {
match self {
ThemeName::Dark => ThemeName::Light,
ThemeName::Light => ThemeName::Midnight,
ThemeName::Midnight => ThemeName::Nord,
ThemeName::Nord => ThemeName::Monokai,
ThemeName::Monokai => ThemeName::AnthropicLight,
ThemeName::AnthropicLight => ThemeName::AnthropicDark,
ThemeName::AnthropicDark => ThemeName::Dark,
}
}
pub fn display_name(&self) -> &'static str {
match self {
ThemeName::Dark => "Dark",
ThemeName::Light => "Light",
ThemeName::Midnight => "Midnight(默认)",
ThemeName::Nord => "Nord",
ThemeName::Monokai => "Monokai",
ThemeName::AnthropicLight => "Anthropic Light(米白赭陶)",
ThemeName::AnthropicDark => "Anthropic Dark(深夜月蓝)",
}
}
pub fn parse(s: &str) -> ThemeName {
s.parse().unwrap_or_default()
}
pub fn to_str(&self) -> &'static str {
match self {
ThemeName::Dark => "dark",
ThemeName::Light => "light",
ThemeName::Midnight => "midnight",
ThemeName::Nord => "nord",
ThemeName::Monokai => "monokai",
ThemeName::AnthropicLight => "anthropic_light",
ThemeName::AnthropicDark => "anthropic_dark",
}
}
}