use brep_render::engine_state::EngineState;
pub const DOCUMENT_CLASS_KEY: &str = "documentClass";
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum DocumentClass {
#[default]
Normal,
Family,
Template,
}
impl DocumentClass {
pub const ALL: [DocumentClass; 3] = [Self::Normal, Self::Family, Self::Template];
pub fn extension(self) -> &'static str {
match self {
Self::Normal => ".nbrep",
Self::Family => ".fbrep",
Self::Template => ".tbrep",
}
}
pub fn field(self) -> Option<&'static str> {
match self {
Self::Normal => None,
Self::Family => Some("family"),
Self::Template => Some("template"),
}
}
pub fn label(self) -> &'static str {
match self {
Self::Normal => "Part",
Self::Family => "Family",
Self::Template => "Template",
}
}
pub fn slug(self) -> &'static str {
match self {
Self::Normal => "normal",
Self::Family => "family",
Self::Template => "template",
}
}
pub fn of_name(name: &str) -> Option<Self> {
let lower = name.to_ascii_lowercase();
Self::ALL
.into_iter()
.find(|class| lower.ends_with(class.extension()))
}
pub fn of_field(value: Option<&serde_json::Value>) -> Self {
match value.and_then(serde_json::Value::as_str) {
Some("family") => Self::Family,
Some("template") => Self::Template,
_ => Self::Normal,
}
}
pub fn of_document(document: &serde_json::Value) -> Self {
Self::of_field(document.get(DOCUMENT_CLASS_KEY))
}
pub fn file_name(self, name: &str) -> String {
format!("{}{}", strip_class_extension(name), self.extension())
}
}
pub fn strip_class_extension(name: &str) -> &str {
match DocumentClass::of_name(name) {
Some(class) => &name[..name.len() - class.extension().len()],
None => name,
}
}
pub fn document_class(engine: &EngineState) -> DocumentClass {
DocumentClass::of_field(engine.history.document_block(DOCUMENT_CLASS_KEY))
}
pub fn is_family(engine: &EngineState) -> bool {
document_class(engine) == DocumentClass::Family
}
pub fn is_template(engine: &EngineState) -> bool {
document_class(engine) == DocumentClass::Template
}
pub fn set_document_class(engine: &mut EngineState, class: DocumentClass) {
if document_class(engine) == class
&& (class != DocumentClass::Normal
|| engine.history.document_block(DOCUMENT_CLASS_KEY).is_none())
{
return;
}
engine.history.set_document_block_no_undo(
DOCUMENT_CLASS_KEY,
class.field().map(|field| serde_json::Value::String(field.into())),
);
}
pub fn set_class_in_json(document: &mut serde_json::Value, class: DocumentClass) {
if let Some(object) = document.as_object_mut() {
match class.field() {
Some(field) => {
object.insert(DOCUMENT_CLASS_KEY.into(), serde_json::Value::String(field.into()));
}
None => {
object.remove(DOCUMENT_CLASS_KEY);
}
}
}
}