parse_style/serde/
anstyle.rs

1//! (De)serializing [`anstyle`] types
2use serde::{Deserialize, Serialize, de::Deserializer, ser::Serializer};
3
4/// A module for use via `#[serde(with)]` for serializing & deserializing
5/// [`anstyle::Style`] values as style strings.
6///
7/// Use it like so:
8///
9/// ```
10/// use serde::{Deserialize, Serialize};
11///
12/// #[derive(Deserialize, Serialize)]
13/// struct MyStruct {
14///     #[serde(with = "parse_style::serde::anstyle::style")]
15///     style: anstyle::Style,
16/// }
17/// ```
18pub mod style {
19    use super::*;
20    use anstyle::Style;
21
22    pub fn serialize<S: Serializer>(style: &Style, serializer: S) -> Result<S::Ok, S::Error> {
23        crate::Style::from(*style).serialize(serializer)
24    }
25
26    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Style, D::Error> {
27        crate::Style::deserialize(deserializer).map(Style::from)
28    }
29}
30
31/// A module for use via `#[serde(with)]` for serializing & deserializing
32/// [`anstyle::Color`] values as color words and RGB codes.
33///
34/// Use it like so:
35///
36/// ```
37/// use serde::{Deserialize, Serialize};
38///
39/// #[derive(Deserialize, Serialize)]
40/// struct MyStruct {
41///     #[serde(with = "parse_style::serde::anstyle::color")]
42///     color: anstyle::Color,
43/// }
44/// ```
45///
46/// Note that attempting to deserialize a string of the form `"default"` with
47/// this module will produce an "invalid value" error.
48pub mod color {
49    use super::*;
50    use anstyle::Color;
51    use serde::de::Error;
52
53    pub fn serialize<S: Serializer>(color: &Color, serializer: S) -> Result<S::Ok, S::Error> {
54        crate::Color::from(*color).serialize(serializer)
55    }
56
57    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Color, D::Error> {
58        let c = crate::Color::deserialize(deserializer)?;
59        Color::try_from(c).map_err(|_| D::Error::invalid_value(serde::de::Unexpected::Str("default"), &r##"a color word or a string of the form "color(INT)", "rgb(INT,INT,INT)", or "#xxxxxx""##))
60    }
61}
62
63/// A module for use via `#[serde(with)]` for serializing & deserializing
64/// [`anstyle::Ansi256Color`] values as color words.
65///
66/// Use it like so:
67///
68/// ```
69/// use serde::{Deserialize, Serialize};
70///
71/// #[derive(Deserialize, Serialize)]
72/// struct MyStruct {
73///     #[serde(with = "parse_style::serde::anstyle::ansi256color")]
74///     color: anstyle::Ansi256Color,
75/// }
76/// ```
77pub mod ansi256color {
78    use super::*;
79    use anstyle::Ansi256Color;
80
81    pub fn serialize<S: Serializer>(
82        style: &Ansi256Color,
83        serializer: S,
84    ) -> Result<S::Ok, S::Error> {
85        crate::Color256::from(*style).serialize(serializer)
86    }
87
88    pub fn deserialize<'de, D: Deserializer<'de>>(
89        deserializer: D,
90    ) -> Result<Ansi256Color, D::Error> {
91        crate::Color256::deserialize(deserializer).map(Ansi256Color::from)
92    }
93}
94
95/// A module for use via `#[serde(with)]` for serializing & deserializing
96/// [`anstyle::RgbColor`] values as RGB codes.
97///
98/// Use it like so:
99///
100/// ```
101/// use serde::{Deserialize, Serialize};
102///
103/// #[derive(Deserialize, Serialize)]
104/// struct MyStruct {
105///     #[serde(with = "parse_style::serde::anstyle::rgb_color")]
106///     color: anstyle::RgbColor,
107/// }
108/// ```
109pub mod rgb_color {
110    use super::*;
111    use anstyle::RgbColor;
112
113    pub fn serialize<S: Serializer>(style: &RgbColor, serializer: S) -> Result<S::Ok, S::Error> {
114        crate::RgbColor::from(*style).serialize(serializer)
115    }
116
117    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<RgbColor, D::Error> {
118        crate::RgbColor::deserialize(deserializer).map(RgbColor::from)
119    }
120}