Skip to main content

runmat_meshing_core/contracts/
backend.rs

1use serde::{Deserialize, Serialize};
2
3use super::options::VolumeMeshingOptions;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6#[serde(rename_all = "snake_case")]
7pub enum MeshBackendKind {
8    Auto,
9    Solid,
10    StructuredGridTetrahedron,
11}
12
13impl Default for MeshBackendKind {
14    fn default() -> Self {
15        Self::Auto
16    }
17}
18
19#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct MeshBackendSelection {
21    pub requested: MeshBackendKind,
22    pub selected: MeshBackendKind,
23    pub solid_ready: bool,
24    pub reason: &'static str,
25}
26
27pub fn select_volume_backend(options: &VolumeMeshingOptions) -> MeshBackendSelection {
28    match options.backend {
29        MeshBackendKind::Auto => MeshBackendSelection {
30            requested: MeshBackendKind::Auto,
31            selected: MeshBackendKind::Solid,
32            solid_ready: true,
33            reason: "solid_backend_default",
34        },
35        MeshBackendKind::Solid => MeshBackendSelection {
36            requested: MeshBackendKind::Solid,
37            selected: MeshBackendKind::Solid,
38            solid_ready: true,
39            reason: "explicit_solid_backend",
40        },
41        MeshBackendKind::StructuredGridTetrahedron => MeshBackendSelection {
42            requested: MeshBackendKind::StructuredGridTetrahedron,
43            selected: MeshBackendKind::StructuredGridTetrahedron,
44            solid_ready: false,
45            reason: "explicit_structured_grid_tetrahedron",
46        },
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn auto_selects_solid_backend() {
56        let selection = select_volume_backend(&VolumeMeshingOptions::default());
57
58        assert_eq!(selection.requested, MeshBackendKind::Auto);
59        assert_eq!(selection.selected, MeshBackendKind::Solid);
60        assert!(selection.solid_ready);
61        assert_eq!(selection.reason, "solid_backend_default");
62    }
63
64    #[test]
65    fn explicit_structured_grid_tetrahedron_selects_structured_backend() {
66        let selection = select_volume_backend(&VolumeMeshingOptions {
67            backend: MeshBackendKind::StructuredGridTetrahedron,
68            ..VolumeMeshingOptions::default()
69        });
70
71        assert_eq!(
72            selection.requested,
73            MeshBackendKind::StructuredGridTetrahedron
74        );
75        assert_eq!(
76            selection.selected,
77            MeshBackendKind::StructuredGridTetrahedron
78        );
79        assert!(!selection.solid_ready);
80        assert_eq!(selection.reason, "explicit_structured_grid_tetrahedron");
81    }
82}