brep_app/
document_class.rs1use brep_render::engine_state::EngineState;
14
15pub const DOCUMENT_CLASS_KEY: &str = "documentClass";
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
20pub enum DocumentClass {
21 #[default]
24 Normal,
25 Family,
27 Template,
29}
30
31impl DocumentClass {
32 pub const ALL: [DocumentClass; 3] = [Self::Normal, Self::Family, Self::Template];
33
34 pub fn extension(self) -> &'static str {
36 match self {
37 Self::Normal => ".nbrep",
38 Self::Family => ".fbrep",
39 Self::Template => ".tbrep",
40 }
41 }
42
43 pub fn field(self) -> Option<&'static str> {
46 match self {
47 Self::Normal => None,
48 Self::Family => Some("family"),
49 Self::Template => Some("template"),
50 }
51 }
52
53 pub fn label(self) -> &'static str {
55 match self {
56 Self::Normal => "Part",
57 Self::Family => "Family",
58 Self::Template => "Template",
59 }
60 }
61
62 pub fn slug(self) -> &'static str {
64 match self {
65 Self::Normal => "normal",
66 Self::Family => "family",
67 Self::Template => "template",
68 }
69 }
70
71 pub fn of_name(name: &str) -> Option<Self> {
73 let lower = name.to_ascii_lowercase();
74 Self::ALL
75 .into_iter()
76 .find(|class| lower.ends_with(class.extension()))
77 }
78
79 pub fn of_field(value: Option<&serde_json::Value>) -> Self {
82 match value.and_then(serde_json::Value::as_str) {
83 Some("family") => Self::Family,
84 Some("template") => Self::Template,
85 _ => Self::Normal,
86 }
87 }
88
89 pub fn of_document(document: &serde_json::Value) -> Self {
91 Self::of_field(document.get(DOCUMENT_CLASS_KEY))
92 }
93
94 pub fn file_name(self, name: &str) -> String {
98 format!("{}{}", strip_class_extension(name), self.extension())
99 }
100}
101
102pub fn strip_class_extension(name: &str) -> &str {
104 match DocumentClass::of_name(name) {
105 Some(class) => &name[..name.len() - class.extension().len()],
106 None => name,
107 }
108}
109
110pub fn document_class(engine: &EngineState) -> DocumentClass {
113 DocumentClass::of_field(engine.history.document_block(DOCUMENT_CLASS_KEY))
114}
115
116pub fn is_family(engine: &EngineState) -> bool {
118 document_class(engine) == DocumentClass::Family
119}
120
121pub fn is_template(engine: &EngineState) -> bool {
123 document_class(engine) == DocumentClass::Template
124}
125
126pub fn set_document_class(engine: &mut EngineState, class: DocumentClass) {
129 if document_class(engine) == class
130 && (class != DocumentClass::Normal
131 || engine.history.document_block(DOCUMENT_CLASS_KEY).is_none())
132 {
133 return;
134 }
135 engine.history.set_document_block_no_undo(
136 DOCUMENT_CLASS_KEY,
137 class.field().map(|field| serde_json::Value::String(field.into())),
138 );
139}
140
141pub fn set_class_in_json(document: &mut serde_json::Value, class: DocumentClass) {
143 if let Some(object) = document.as_object_mut() {
144 match class.field() {
145 Some(field) => {
146 object.insert(DOCUMENT_CLASS_KEY.into(), serde_json::Value::String(field.into()));
147 }
148 None => {
149 object.remove(DOCUMENT_CLASS_KEY);
150 }
151 }
152 }
153}
154