Parse hex colour codes in serde:🇩🇪:Deserialize
(#801)
This commit is contained in:
parent
2cb2658180
commit
ff01914328
@ -271,7 +271,7 @@ impl<'de> serde::de::Deserialize<'de> for Color {
|
|||||||
type Value = Color;
|
type Value = Color;
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
formatter.write_str(
|
formatter.write_str(
|
||||||
"`black`, `blue`, `dark_blue`, `cyan`, `dark_cyan`, `green`, `dark_green`, `grey`, `dark_grey`, `magenta`, `dark_magenta`, `red`, `dark_red`, `white`, `yellow`, `dark_yellow`, `ansi_(value)`, or `rgb_(r,g,b)`",
|
"`black`, `blue`, `dark_blue`, `cyan`, `dark_cyan`, `green`, `dark_green`, `grey`, `dark_grey`, `magenta`, `dark_magenta`, `red`, `dark_red`, `white`, `yellow`, `dark_yellow`, `ansi_(value)`, or `rgb_(r,g,b)` or `#rgbhex`",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
fn visit_str<E>(self, value: &str) -> Result<Color, E>
|
fn visit_str<E>(self, value: &str) -> Result<Color, E>
|
||||||
@ -304,6 +304,20 @@ impl<'de> serde::de::Deserialize<'de> for Color {
|
|||||||
let g = results[1].parse::<u8>();
|
let g = results[1].parse::<u8>();
|
||||||
let b = results[2].parse::<u8>();
|
let b = results[2].parse::<u8>();
|
||||||
|
|
||||||
|
if r.is_ok() && g.is_ok() && b.is_ok() {
|
||||||
|
return Ok(Color::Rgb {
|
||||||
|
r: r.unwrap(),
|
||||||
|
g: g.unwrap(),
|
||||||
|
b: b.unwrap(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if let Some(hex) = value.strip_prefix('#') {
|
||||||
|
if hex.is_ascii() && hex.len() == 6 {
|
||||||
|
let r = u8::from_str_radix(&hex[0..2], 16);
|
||||||
|
let g = u8::from_str_radix(&hex[2..4], 16);
|
||||||
|
let b = u8::from_str_radix(&hex[4..6], 16);
|
||||||
|
|
||||||
if r.is_ok() && g.is_ok() && b.is_ok() {
|
if r.is_ok() && g.is_ok() && b.is_ok() {
|
||||||
return Ok(Color::Rgb {
|
return Ok(Color::Rgb {
|
||||||
r: r.unwrap(),
|
r: r.unwrap(),
|
||||||
@ -476,4 +490,24 @@ mod serde_tests {
|
|||||||
assert!(serde_json::from_str::<Color>("\"rgb_(255,255,255,255)\"").is_err());
|
assert!(serde_json::from_str::<Color>("\"rgb_(255,255,255,255)\"").is_err());
|
||||||
assert!(serde_json::from_str::<Color>("\"rgb_(256,255,255)\"").is_err());
|
assert!(serde_json::from_str::<Color>("\"rgb_(256,255,255)\"").is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deserial_rgb_hex() {
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::from_str::<Color>("\"#ffffff\"").unwrap(),
|
||||||
|
Color::from((255, 255, 255))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::from_str::<Color>("\"#FFFFFF\"").unwrap(),
|
||||||
|
Color::from((255, 255, 255))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deserial_unvalid_rgb_hex() {
|
||||||
|
assert!(serde_json::from_str::<Color>("\"#FFFFFFFF\"").is_err());
|
||||||
|
assert!(serde_json::from_str::<Color>("\"#FFGFFF\"").is_err());
|
||||||
|
// Ferris is 4 bytes so this will be considered the correct length.
|
||||||
|
assert!(serde_json::from_str::<Color>("\"#ff🦀\"").is_err());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user