Skip to main content

jellyflow_core/core/model/
geometry.rs

1use serde::{Deserialize, Serialize};
2
3/// A 2D point in canvas space.
4#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
5pub struct CanvasPoint {
6    /// X coordinate.
7    pub x: f32,
8    /// Y coordinate.
9    pub y: f32,
10}
11
12impl CanvasPoint {
13    pub fn is_finite(self) -> bool {
14        self.x.is_finite() && self.y.is_finite()
15    }
16}
17
18/// A 2D size in canvas space.
19#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
20pub struct CanvasSize {
21    /// Width.
22    pub width: f32,
23    /// Height.
24    pub height: f32,
25}
26
27impl CanvasSize {
28    pub fn is_finite(self) -> bool {
29        self.width.is_finite() && self.height.is_finite()
30    }
31
32    pub fn is_positive_finite(self) -> bool {
33        self.is_finite() && self.width > 0.0 && self.height > 0.0
34    }
35}
36
37/// A rectangle in canvas space.
38#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
39pub struct CanvasRect {
40    /// Top-left origin.
41    pub origin: CanvasPoint,
42    /// Size.
43    pub size: CanvasSize,
44}
45
46impl CanvasRect {
47    pub fn is_finite(self) -> bool {
48        self.origin.is_finite() && self.size.is_finite()
49    }
50
51    pub fn is_positive_finite(self) -> bool {
52        self.origin.is_finite() && self.size.is_positive_finite()
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::{CanvasPoint, CanvasRect, CanvasSize};
59
60    #[test]
61    fn canvas_rect_is_positive_finite_requires_finite_origin_and_positive_size() {
62        let valid = CanvasRect {
63            origin: CanvasPoint { x: 1.0, y: -2.0 },
64            size: CanvasSize {
65                width: 10.0,
66                height: 20.0,
67            },
68        };
69        assert!(valid.is_positive_finite());
70
71        let zero_width = CanvasRect {
72            size: CanvasSize {
73                width: 0.0,
74                height: 20.0,
75            },
76            ..valid
77        };
78        assert!(!zero_width.is_positive_finite());
79
80        let non_finite_origin = CanvasRect {
81            origin: CanvasPoint {
82                x: f32::INFINITY,
83                y: 0.0,
84            },
85            ..valid
86        };
87        assert!(!non_finite_origin.is_positive_finite());
88    }
89}