Add custom serde implemenation for color

This commit is contained in:
hodasemi 2024-03-25 15:08:39 +01:00
parent 2e51faed54
commit 571dedbd2e
2 changed files with 56 additions and 1 deletions

View file

@ -14,3 +14,7 @@ reprc_proc_macro = { path = "src/reprc_proc_macro" }
# networking # networking
serde = { version = "1.0.197", features = ["derive"] } serde = { version = "1.0.197", features = ["derive"] }
[dev-dependencies]
serde_json = { version = "1.0.114" }

View file

@ -3,10 +3,11 @@ use std::ops::MulAssign;
use std::str::FromStr; use std::str::FromStr;
use std::{convert::TryFrom, ops::Mul}; use std::{convert::TryFrom, ops::Mul};
use serde::de::Visitor;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
/// `TextColor` describes the color of the text /// `TextColor` describes the color of the text
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum Color { pub enum Color {
White, White,
Black, Black,
@ -189,6 +190,46 @@ impl Default for Color {
} }
} }
impl Serialize for Color {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(&format!("{self}"))
}
}
impl<'de> Deserialize<'de> for Color {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct ColorVisitor;
impl<'de> Visitor<'de> for ColorVisitor {
type Value = Color;
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("`color`")
}
fn visit_str<E>(self, value: &str) -> Result<Color, E>
where
E: serde::de::Error,
{
Color::try_from(value).map_err(|_| {
serde::de::Error::invalid_value(
serde::de::Unexpected::Str(value),
&ColorVisitor,
)
})
}
}
deserializer.deserialize_identifier(ColorVisitor)
}
}
#[test] #[test]
fn simple_color_conversion() { fn simple_color_conversion() {
let color = Color::try_from("white").unwrap(); let color = Color::try_from("white").unwrap();
@ -206,3 +247,13 @@ fn hex_color_conversion() {
assert_eq!(string, "#FFFFFF"); assert_eq!(string, "#FFFFFF");
} }
#[test]
fn color_serde() {
let color = Color::try_from("#a64b4b").unwrap();
let s = serde_json::to_string(&color).unwrap();
let c = serde_json::from_str(&s).unwrap();
assert_eq!(color, c);
}