hecate/codegen/input_schema/
mesh.rs1use 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 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}