Skip to main content

use_rigid_folding/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_angle::Angle;
5
6/// A rigid fold around a crease index.
7#[derive(Debug, Clone, Copy, PartialEq)]
8pub struct RigidFold {
9    crease_index: usize,
10    angle: Angle,
11}
12
13impl RigidFold {
14    /// Creates a rigid fold.
15    #[must_use]
16    pub const fn new(crease_index: usize, angle: Angle) -> Self {
17        Self {
18            crease_index,
19            angle,
20        }
21    }
22
23    /// Returns the crease index.
24    #[must_use]
25    pub const fn crease_index(self) -> usize {
26        self.crease_index
27    }
28
29    /// Returns the fold angle.
30    #[must_use]
31    pub const fn angle(self) -> Angle {
32        self.angle
33    }
34}
35
36/// A sequence of rigid folds.
37#[derive(Debug, Clone, PartialEq)]
38pub struct RigidFoldSequence {
39    folds: Vec<RigidFold>,
40}
41
42impl RigidFoldSequence {
43    /// Creates a rigid-fold sequence.
44    #[must_use]
45    pub const fn new(folds: Vec<RigidFold>) -> Self {
46        Self { folds }
47    }
48
49    /// Returns the folds.
50    #[must_use]
51    pub fn folds(&self) -> &[RigidFold] {
52        &self.folds
53    }
54
55    /// Returns the fold count.
56    #[must_use]
57    pub fn fold_count(&self) -> usize {
58        self.folds.len()
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::{RigidFold, RigidFoldSequence};
65    use use_angle::Angle;
66
67    #[test]
68    fn stores_rigid_fold_sequences() {
69        let fold = RigidFold::new(0, Angle::from_degrees(45.0));
70        let sequence = RigidFoldSequence::new(vec![fold]);
71
72        assert_eq!(fold.crease_index(), 0);
73        assert_eq!(fold.angle().degrees(), 45.0);
74        assert_eq!(sequence.fold_count(), 1);
75        assert_eq!(sequence.folds(), &[fold]);
76    }
77}