use resvg::usvg::Rect;
use serde::ser::SerializeSeq;
use serde::{Serialize, Serializer};
pub fn serialize_rect<S>(rect: &Option<Rect>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match rect {
Some(r) => {
let mut seq = serializer.serialize_seq(Some(4))?;
for num in [r.left(), r.top(), r.right(), r.bottom()] {
if num.fract() == 0.0 {
seq.serialize_element(&(num.round() as i32))?;
} else {
seq.serialize_element(&((num * 1e3).round() / 1e3))?;
}
}
seq.end()
}
None => serializer.serialize_none(),
}
}
pub fn serialize_stretch_x_area<S>(
rects: &Option<Vec<Rect>>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match rects {
Some(rects) => {
let mut seq = serializer.serialize_seq(Some(rects.len()))?;
for rect in rects {
let line = [icon_number(rect.left()), icon_number(rect.right())];
seq.serialize_element(&line)?;
}
seq.end()
}
None => serializer.serialize_none(),
}
}
pub fn serialize_stretch_y_area<S>(
rects: &Option<Vec<Rect>>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match rects {
Some(rects) => {
let mut seq = serializer.serialize_seq(Some(rects.len()))?;
for rect in rects {
let line = [icon_number(rect.top()), icon_number(rect.bottom())];
seq.serialize_element(&line)?;
}
seq.end()
}
None => serializer.serialize_none(),
}
}
#[derive(Serialize)]
#[serde(untagged)]
enum Number {
Int(u32),
Float(f32),
}
fn icon_number(num: f32) -> Number {
if num.fract() == 0.0 {
Number::Int(num.round() as u32)
} else {
Number::Float((num * 1e3).round() / 1e3)
}
}