1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_point::Point2;
5
6#[derive(Debug, Clone, PartialEq)]
8pub struct Spline2 {
9 control_points: Vec<Point2>,
10}
11
12impl Spline2 {
13 #[must_use]
15 pub fn new(control_points: Vec<Point2>) -> Option<Self> {
16 if control_points.len() >= 2 {
17 Some(Self { control_points })
18 } else {
19 None
20 }
21 }
22
23 #[must_use]
25 pub fn control_points(&self) -> &[Point2] {
26 &self.control_points
27 }
28
29 #[must_use]
31 pub fn control_point_count(&self) -> usize {
32 self.control_points.len()
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::Spline2;
39 use use_point::Point2;
40
41 #[test]
42 fn validates_control_point_count() {
43 assert_eq!(Spline2::new(vec![Point2::origin()]), None);
44
45 let spline =
46 Spline2::new(vec![Point2::origin(), Point2::new(1.0, 1.0)]).expect("valid spline");
47 assert_eq!(spline.control_point_count(), 2);
48 assert_eq!(spline.control_points()[1], Point2::new(1.0, 1.0));
49 }
50}