1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use fj_interop::mesh::Color;

use crate::{
    insert::Insert,
    objects::{Face, Objects, Surface},
    services::Service,
    storage::Handle,
};

use super::CycleBuilder;

/// Builder API for [`Face`]
pub struct FaceBuilder {
    surface: Handle<Surface>,
    exterior: CycleBuilder,
    interiors: Vec<CycleBuilder>,
    color: Option<Color>,
}
impl FaceBuilder {
    /// Create an instance of `FaceBuilder`
    pub fn new(surface: Handle<Surface>) -> Self {
        Self {
            surface,
            exterior: CycleBuilder::new(),
            interiors: Vec::new(),
            color: None,
        }
    }

    /// Replace the face's exterior cycle
    pub fn with_exterior(mut self, exterior: CycleBuilder) -> Self {
        self.exterior = exterior;
        self
    }

    /// Add an interior cycle to the face
    pub fn with_interior(mut self, interior: CycleBuilder) -> Self {
        self.interiors.push(interior);
        self
    }

    /// Define the color of the face
    pub fn with_color(mut self, color: Color) -> Self {
        self.color = Some(color);
        self
    }

    /// Build the face
    pub fn build(self, objects: &mut Service<Objects>) -> Face {
        let exterior = self.exterior.build(objects).insert(objects);
        let interiors = self
            .interiors
            .into_iter()
            .map(|cycle| cycle.build(objects).insert(objects));

        Face::new(self.surface, exterior, interiors, self.color)
    }
}