Skip to main content

use_spline/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_point::Point2;
5
6/// A 2D spline control-point sequence.
7#[derive(Debug, Clone, PartialEq)]
8pub struct Spline2 {
9    control_points: Vec<Point2>,
10}
11
12impl Spline2 {
13    /// Creates a spline with at least two control points.
14    #[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    /// Returns the control points.
24    #[must_use]
25    pub fn control_points(&self) -> &[Point2] {
26        &self.control_points
27    }
28
29    /// Returns the number of control points.
30    #[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}