parent
da3eee654b
commit
50cae5c962
@ -0,0 +1,77 @@
|
||||
use serde::{
|
||||
de::{SeqAccess, Visitor},
|
||||
ser::SerializeSeq,
|
||||
Deserialize, Deserializer, Serialize, Serializer,
|
||||
};
|
||||
use svgtypes::{Length, LengthUnit};
|
||||
|
||||
pub fn serialize<S>(length: &[Option<Length>; 2], serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
let mut seq = serializer.serialize_seq(Some(2))?;
|
||||
for i in 0..2 {
|
||||
let length_def = length[i].clone().map(|length| LengthDef {
|
||||
number: length.number,
|
||||
unit: length.unit,
|
||||
});
|
||||
seq.serialize_element(&length_def)?;
|
||||
}
|
||||
seq.end()
|
||||
}
|
||||
|
||||
struct OptionalLengthArrayVisitor;
|
||||
impl<'de> Visitor<'de> for OptionalLengthArrayVisitor {
|
||||
type Value = [Option<Length>; 2];
|
||||
|
||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(formatter, "SVG dimension array")
|
||||
}
|
||||
|
||||
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let x = seq.next_element::<Option<LengthDef>>()?.flatten();
|
||||
let y = seq.next_element::<Option<LengthDef>>()?.flatten();
|
||||
Ok([
|
||||
x.map(|length_def| Length {
|
||||
number: length_def.number,
|
||||
unit: length_def.unit,
|
||||
}),
|
||||
y.map(|length_def| Length {
|
||||
number: length_def.number,
|
||||
unit: length_def.unit,
|
||||
}),
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<[Option<Length>; 2], D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
deserializer.deserialize_seq(OptionalLengthArrayVisitor)
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct LengthDef {
|
||||
number: f64,
|
||||
#[serde(with = "LengthUnitDef")]
|
||||
unit: LengthUnit,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(remote = "LengthUnit")]
|
||||
enum LengthUnitDef {
|
||||
None,
|
||||
Em,
|
||||
Ex,
|
||||
Px,
|
||||
In,
|
||||
Cm,
|
||||
Mm,
|
||||
Pt,
|
||||
Pc,
|
||||
Percent,
|
||||
}
|
Loading…
Reference in new issue