use serde::Deserialize;
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum BuiltinColor {
Black,
Red,
Green,
Yellow,
Blue,
Magenta,
Cyan,
White,
BrightBlack,
BrightRed,
BrightGreen,
BrightYellow,
BrightBlue,
BrightMagenta,
BrightCyan,
BrightWhite,
Default,
}
#[derive(Debug, PartialEq, Deserialize)]
#[serde(untagged)]
pub enum Color {
BuiltinColor(BuiltinColor),
Rgb(String),
}
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Attribute {
Underline,
Reverse,
Blink,
Bold,
Dim,
Italic,
FinalFg,
FinalBg,
FinalAttr,
}
#[derive(Debug, PartialEq, Deserialize)]
pub struct Face {
fg: Color,
bg: Color,
attributes: Vec<Attribute>,
}
#[derive(Debug, PartialEq, Deserialize)]
pub struct Atom {
face: Face,
contents: String,
}
pub type Line = Vec<Atom>;
#[derive(Debug, PartialEq, Deserialize)]
pub struct Coord {
line: i32,
column: i32,
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn deserialize_color() {
assert_eq!(
serde_json::from_str::<Color>("\"red\"").unwrap(),
Color::BuiltinColor(BuiltinColor::Red)
);
assert_eq!(
serde_json::from_str::<Color>("\"default\"").unwrap(),
Color::BuiltinColor(BuiltinColor::Default)
);
assert_eq!(
serde_json::from_str::<Color>("\"rgb:223ffa\"").unwrap(),
Color::Rgb(String::from("rgb:223ffa"))
);
}
}