brep_app/
document_class.rs1use brep_render::engine_state::EngineState;
14
15pub const DOCUMENT_CLASS_KEY: &str = brep_render::brep_kernel::family::DOCUMENT_CLASS_KEY;
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
20pub enum DocumentClass {
21 #[default]
24 Normal,
25 Family,
27 Template,
29 Instructions,
34}
35
36impl DocumentClass {
37 pub const ALL: [DocumentClass; 3] = [Self::Normal, Self::Family, Self::Template];
39 pub const KNOWN: [DocumentClass; 4] = [Self::Normal, Self::Family, Self::Template, Self::Instructions];
41
42 pub fn extension(self) -> &'static str {
44 match self {
45 Self::Normal => ".nbrep",
46 Self::Family => ".fbrep",
47 Self::Template => ".tbrep",
48 Self::Instructions => ".ibrep",
49 }
50 }
51
52 pub fn field(self) -> Option<&'static str> {
55 match self {
56 Self::Normal => None,
57 Self::Family => Some("family"),
58 Self::Template => Some("template"),
59 Self::Instructions => Some("instructions"),
60 }
61 }
62
63 pub fn label(self) -> &'static str {
65 match self {
66 Self::Normal => "Part",
67 Self::Family => "Family",
68 Self::Template => "Template",
69 Self::Instructions => "Instructions",
70 }
71 }
72
73 pub fn slug(self) -> &'static str {
75 match self {
76 Self::Normal => "normal",
77 Self::Family => "family",
78 Self::Template => "template",
79 Self::Instructions => "instructions",
80 }
81 }
82
83 pub fn of_name(name: &str) -> Option<Self> {
85 let lower = name.to_ascii_lowercase();
86 Self::KNOWN
87 .into_iter()
88 .find(|class| lower.ends_with(class.extension()))
89 }
90
91 pub fn of_field(value: Option<&serde_json::Value>) -> Self {
94 match value.and_then(serde_json::Value::as_str) {
95 Some("family") => Self::Family,
96 Some("template") => Self::Template,
97 Some("instructions") => Self::Instructions,
98 _ => Self::Normal,
99 }
100 }
101
102 pub fn of_document(document: &serde_json::Value) -> Self {
104 Self::of_field(document.get(DOCUMENT_CLASS_KEY))
105 }
106
107 pub fn file_name(self, name: &str) -> String {
111 format!("{}{}", strip_class_extension(name), self.extension())
112 }
113}
114
115pub fn strip_class_extension(name: &str) -> &str {
117 match DocumentClass::of_name(name) {
118 Some(class) => &name[..name.len() - class.extension().len()],
119 None => name,
120 }
121}
122
123pub fn document_class(engine: &EngineState) -> DocumentClass {
126 DocumentClass::of_field(engine.history.document_block(DOCUMENT_CLASS_KEY))
127}
128
129pub fn is_family(engine: &EngineState) -> bool {
131 document_class(engine) == DocumentClass::Family
132}
133
134pub fn is_template(engine: &EngineState) -> bool {
136 document_class(engine) == DocumentClass::Template
137}
138
139pub fn set_document_class(engine: &mut EngineState, class: DocumentClass) {
142 if document_class(engine) == class
143 && (class != DocumentClass::Normal
144 || engine.history.document_block(DOCUMENT_CLASS_KEY).is_none())
145 {
146 return;
147 }
148 engine.history.set_document_block_no_undo(
149 DOCUMENT_CLASS_KEY,
150 class.field().map(|field| serde_json::Value::String(field.into())),
151 );
152}
153
154pub fn set_class_in_json(document: &mut serde_json::Value, class: DocumentClass) {
156 if let Some(object) = document.as_object_mut() {
157 match class.field() {
158 Some(field) => {
159 object.insert(DOCUMENT_CLASS_KEY.into(), serde_json::Value::String(field.into()));
160 }
161 None => {
162 object.remove(DOCUMENT_CLASS_KEY);
163 }
164 }
165 }
166}
167