jellyflow_core/core/model/
geometry.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
5pub struct CanvasPoint {
6 pub x: f32,
8 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#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
20pub struct CanvasSize {
21 pub width: f32,
23 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#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
39pub struct CanvasRect {
40 pub origin: CanvasPoint,
42 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}