hayro_syntax/object/
rect.rs

1//! Rectangles.
2
3use crate::object::Array;
4use crate::object::{Object, ObjectLike};
5use crate::reader::{Readable, Reader, ReaderContext};
6
7pub use kurbo::Rect;
8
9impl<'a> Readable<'a> for Rect {
10    fn read(r: &mut Reader<'a>, ctx: &ReaderContext<'a>) -> Option<Self> {
11        let arr = r.read::<Array>(ctx)?;
12        from_arr(&arr)
13    }
14}
15
16fn from_arr(array: &Array) -> Option<Rect> {
17    let mut iter = array.iter::<f32>();
18    let x0 = iter.next()? as f64;
19    let y0 = iter.next()? as f64;
20    let x1 = iter.next()? as f64;
21    let y1 = iter.next()? as f64;
22
23    Some(Rect::new(x0.min(x1), y0.min(y1), x1.max(x0), y1.max(y0)))
24}
25
26impl TryFrom<Object<'_>> for Rect {
27    type Error = ();
28
29    fn try_from(value: Object<'_>) -> Result<Self, Self::Error> {
30        match value {
31            Object::Array(arr) => from_arr(&arr).ok_or(()),
32            _ => Err(()),
33        }
34    }
35}
36
37impl ObjectLike<'_> for Rect {}