hecate/codegen/input_schema/
mesh.rs

1use std::any::Any;
2
3use dyn_clone::DynClone;
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7use crate::codegen::input_schema::quantity::Length;
8
9use super::range::Range;
10
11#[typetag::serde(tag = "type")]
12pub trait Mesh: std::fmt::Debug + DynClone + Any {
13    fn get_ref(&self) -> &dyn Mesh;
14
15    fn as_any(&self) -> &dyn Any {
16        self.get_ref() as &dyn Any
17    }
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
21#[serde(tag = "type")]
22#[serde(rename_all = "snake_case")]
23pub enum MeshEnum {
24    HyperCube(HyperCubeMesh),
25}
26
27impl MeshEnum {
28    pub fn get_ref(&self) -> &dyn Mesh {
29        match self {
30            MeshEnum::HyperCube(m) => m.get_ref(),
31        }
32    }
33}
34
35dyn_clone::clone_trait_object!(Mesh);
36
37#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
38#[serde(default)]
39pub struct HyperCubeMesh {
40    pub range: Range<Length>,
41
42    /// # Resolution
43    /// The size of each cell.
44    pub resolution: Length,
45    pub show_info: bool,
46}
47
48impl Default for HyperCubeMesh {
49    fn default() -> Self {
50        HyperCubeMesh {
51            range: "0 m .. 1 m".parse().unwrap(),
52            resolution: "0.03125 m".parse().expect("valid length"),
53            show_info: false,
54        }
55    }
56}
57
58#[typetag::serde(name = "hyper_cube")]
59impl Mesh for HyperCubeMesh {
60    fn get_ref(&self) -> &dyn Mesh {
61        self as &dyn Mesh
62    }
63}